Haskell FRP框架和IO
我刚刚调查了Haskell的FRP(主要是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
reactive banana
(推荐!)),我想知道这对他们来说是否很普遍,如果是reactive banana,为什么要在IO
monad中操作,而不是被限制在MonadIO
,或者更好,任何monad
(以便我可以提供自己的堆栈)
在我看来,这似乎是因为对GUI编程的关注,您将其与在IO
中运行的一些现有库集成?是否可以更改它,以便将其与自定义monad堆栈集成?如果您问为什么
reactimate :: Frameworks t => Event t (IO ()) -> Moment t ()
预期事件的值类型为IO()
,而不允许使用实例MonadIO M
自定义monadM()
,那么答案是:
在实践中,自定义单子堆栈只会将状态/读写器效果添加到基本的IO
monad。然而,从理论上讲,完全可以添加诸如协同程序或非确定性等奇特的控制机制。我不知道如何将combinatorsaccumE
产生的内部状态与这些更一般的效果相结合,以及我不知道在非确定性上下文中发生事件意味着什么。这就是为什么reactimate
被限制为IO
如果您有一个state/reader/writer系列的自定义monad堆栈,那么通常可以将其映射到纯
IO
计算,并将其与reactimate
一起使用。如果您发现这不起作用(我确实认为可能有问题),我需要对具体情况进行更详细的描述才能提供帮助。好问题,我还想知道为什么反应型香蕉会做出这个决定。你看过Yampa了吗,他们采取了不同的路径。不,还没有。我现在想知道我是否可以通过反应型香蕉源代码强行改变每一个IO对于MonadIO m
,我的推理是,如果您(遵循老虎机示例)使用fire
函数调用事件,该函数只返回一个IO操作(因此处理程序也是IO操作)显然,我对细节一无所知,所以这只是我的直觉……好吧,当你用fire
调用事件时,你总是可以使用liftIO
,如果这是你的意思的话。