我刚刚一直在研究 Haskell 中的 FRP(主要是reactive-banana
(推荐!)),我想知道这对他们来说是否常见,如果是响应式香蕉,那么在IO
monad 中操作而不是被限制为MonadIO
rven的原因是什么更好,任何Monad
(以便我可以提供自己的堆栈)?
在我看来,这是因为专注于 GUI 编程,你将它与一些现有的库集成在IO
哪里?更改它以便我可以将它与自定义 monad 堆栈集成是否可行?
我刚刚一直在研究 Haskell 中的 FRP(主要是reactive-banana
(推荐!)),我想知道这对他们来说是否常见,如果是响应式香蕉,那么在IO
monad 中操作而不是被限制为MonadIO
rven的原因是什么更好,任何Monad
(以便我可以提供自己的堆栈)?
在我看来,这是因为专注于 GUI 编程,你将它与一些现有的库集成在IO
哪里?更改它以便我可以将它与自定义 monad 堆栈集成是否可行?
如果你问为什么
reactimate :: Frameworks t => Event t (IO ()) -> Moment t ()
期望一个带有 type 值的事件,IO ()
而不是允许一个带有 的自定义 monad M ()
,instance MonadIO M
那么答案是这样的:
在实践中,自定义 monad 堆栈仅将状态/读取器/写入器效果添加到基本IO
monad。但是,理论上,完全可以添加像协程或非确定性这样的花哨的控制机制。我不知道如何将组合器产生的内部状态accumE
与这些更一般的效果相结合,我也不知道在非确定性上下文中发生事件意味着什么。这就是为什么reactimate
限制在IO
.
如果您有一个属于 state/reader/writer 系列的自定义 monad 堆栈,那么通常可以将其映射到纯IO
计算并将其与reactimate
. 如果您发现这不起作用(我确实认为可能存在问题),我需要对具体情况进行更详细的描述才能提供帮助。