Haskell FRP框架和IO

Haskell FRP框架和IO,haskell,frp,reactive-banana,Haskell,Frp,Reactive Banana,我刚刚调查了Haskell的FRP(主要是reactive banana(推荐!)),我想知道这对他们来说是否很普遍,如果是reactive banana,为什么要在IOmonad中操作,而不是被限制在MonadIO,或者更好,任何monad(以便我可以提供自己的堆栈) 在我看来,这似乎是因为对GUI编程的关注,您将其与在IO中运行的一些现有库集成?是否可以更改它,以便将其与自定义monad堆栈集成?如果您问为什么 reactimate :: Frameworks t => Event t

我刚刚调查了Haskell的FRP(主要是
reactive banana
(推荐!)),我想知道这对他们来说是否很普遍,如果是reactive banana,为什么要在
IO
monad中操作,而不是被限制在
MonadIO
,或者更好,任何
monad
(以便我可以提供自己的堆栈)

在我看来,这似乎是因为对GUI编程的关注,您将其与在
IO
中运行的一些现有库集成?是否可以更改它,以便将其与自定义monad堆栈集成?

如果您问为什么

reactimate :: Frameworks t => Event t (IO ()) -> Moment t ()
预期事件的值类型为
IO()
,而不允许使用
实例MonadIO M
自定义monad
M()
,那么答案是:

在实践中,自定义单子堆栈只会将状态/读写器效果添加到基本的
IO
monad。然而,从理论上讲,完全可以添加诸如协同程序或非确定性等奇特的控制机制。我不知道如何将combinators
accumE
产生的内部状态与这些更一般的效果相结合,以及我不知道在非确定性上下文中发生事件意味着什么。这就是为什么
reactimate
被限制为
IO


如果您有一个state/reader/writer系列的自定义monad堆栈,那么通常可以将其映射到纯
IO
计算,并将其与
reactimate
一起使用。如果您发现这不起作用(我确实认为可能有问题),我需要对具体情况进行更详细的描述才能提供帮助。

好问题,我还想知道为什么反应型香蕉会做出这个决定。你看过Yampa了吗,他们采取了不同的路径。不,还没有。我现在想知道我是否可以通过反应型香蕉源代码强行改变每一个IO对于
MonadIO m
,我的推理是,如果您(遵循老虎机示例)使用
fire
函数调用事件,该函数只返回一个IO操作(因此处理程序也是IO操作)显然,我对细节一无所知,所以这只是我的直觉……好吧,当你用
fire
调用事件时,你总是可以使用
liftIO
,如果这是你的意思的话。