[英]How to transform events with an IO function?
讓我說我有
e1 :: Event t A
f :: A -> IO B
我想創造
e2 :: Event t B
由e1
觸發,其值通過在事件發生時對e1
的值執行f
來確定。
通過動態事件切換和使用處理程序,我看到了兩種可能的方法,但是對於這么簡單的事情,它們看起來都太復雜了。
這樣做的正確方法是什么?
由於函數f
有副作用,這實際上並不是一件簡單的事情。 主要原因是當存在多個同時發生的事件時,副作用的順序沒有明確定義。 更一般地說,我無法想象在事件中處理IO動作的良好語義。 因此,反應性香蕉不能為這種情況提供純粹的組合劑。
如果你想要這樣做,你必須使用更精細的機制,也決定副作用的順序。 例如,您可以使用reactimate
組合並編寫組合子
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
但請注意,這可能會產生意外結果,因為結果事件e2
不再與輸入事件e1
同時發生。 例如,行為可能已經改變,並且可能已經執行了其他副作用。
你可以在reactimate
調用中調用函數f
(據我所知,這是從事件網絡處理IO的“正確方法”)嗎? 從那里,向事件網絡Event t B
類型的新事件。 或者這就是“使用處理程序”的意思嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.