Ponieważ funkcja f
ma efekt uboczny, w rzeczywistości nie jest to proste. Głównym powodem jest to, że kolejność efektów ubocznych nie jest dobrze zdefiniowana, gdy występuje wiele jednoczesnych zdarzeń. Ogólnie rzecz biorąc, nie byłem w stanie wyobrazić sobie dobrej semantyki do radzenia sobie z działaniami IO w wydarzeniach. W konsekwencji, reaktywny-banan nie zapewnia czystego kombinatora dla tej sytuacji.
Jeśli jednak chcesz to zrobić, musisz użyć bardziej rozbudowanego mechanizmu, który określa kolejność efektów ubocznych. Na przykład, można użyć reactimate
i napisać COMBINATOR
mapIO :: Frameworks t => (a -> IO b) -> Event t a -> Moment t (Event t b)
mapIO f e1 = do
(e2, fire2) <- liftIO newAddHandler
reactimate $ (\x -> f x >>= fire2) <$> e1
fromAddHandler e2
Należy jednak pamiętać, że może to dać nieoczekiwane rezultaty w przypadku wyników e2
nie jest już równoczesny ze zdarzeniem wejściowym e1
. Na przykład zachowanie mogło się zmienić i inne efekty uboczne mogły zostać wykonane.
to opcja "unsafePerformIO"? – Ankur
@Ankur: nie, to zdecydowanie nie jest "właściwa droga". –