簡體   English   中英

如何使用IO函數轉換事件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM