gpt4 book ai didi

haskell - 如何用IO函数转换事件?

转载 作者:行者123 更新时间:2023-12-02 18:35:53 24 4
gpt4 key购买 nike

假设我有

e1 :: Event t A
f :: A -> IO B

我要创建

e2 :: Event t B

e1触发,其值由事件发生时对e1的值执行f确定.

我发现有两种可能的方法可以做到这一点,即通过动态事件切换和使用处理程序,但对于如此简单的事情来说,它们看起来都太复杂了。

执行此操作的正确方法是什么?

最佳答案

由于函数f有副作用,所以这实际上不是一件简单的事情。主要原因是当有多个同时发生的事件时,副作用的顺序没有明确定义。更一般地说,我无法设想一个好的语义来处理事件中的 IO 操作。因此,reactive-banana 并没有为这种情况提供纯粹的组合器。

如果您无论如何都想这样做,则必须使用更复杂的机制来确定副作用的顺序。例如,您可以使用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 同时发生。例如,行为可能已经改变,其他副作用可能已经执行。

关于haskell - 如何用IO函数转换事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com