Poiché la funzione f
ha un effetto collaterale, questa non è in realtà una cosa semplice da fare. Il motivo principale è che l'ordine degli effetti collaterali non è ben definito quando ci sono più eventi simultanei. Più in generale, non ero in grado di concepire una buona semantica per trattare le azioni IO negli eventi. Di conseguenza, la banana reattiva non fornisce un combinatore puro per questa situazione.
Se si desidera comunque fare ciò, è necessario utilizzare un meccanismo più elaborato che determina anche l'ordine degli effetti collaterali. Per esempio, è possibile utilizzare reactimate
e scrivere un combinatore
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
Tuttavia, si noti che questo può dare risultati inattesi come l'evento result e2
non è più contemporanea con l'evento di ingresso e1
. Ad esempio, i comportamenti potrebbero essere cambiati e altri effetti collaterali potrebbero essere stati eseguiti.
fonte
2013-06-24 10:18:41
è un'opzione 'unsafePerformIO'? – Ankur
@Ankur: no, non è sicuramente un "modo corretto". –