我一直在阅读Functional Reactive Programming,虽然我没有在任何语言中广泛使用monad,但我不禁在FRP设计中看到无处不在。< / p>
This question's answers对功能性反应式编程 有一些很好的描述,我不会在这里尝试复制它。基本上,FRP会创建随时间变化的值之间的关系。
所以这不能单独表示吗?封装需要在monad中随时间修改的值的代码,将其称为Signal
,然后使用这些信号(为简单起见,使用Haskell do-notation)。
do
mx <- mouseX
my <- mouseY
wave <- currentTime >>= liftM sin
-- do some stuff with these values
或者FRP还有比我理解更多的东西吗?是否存在使用monad阻止使用这种简单表示的范例?或者这是对FRP如何运作的有效(如果可能是简化的)理解?
答案 0 :(得分:11)
行为可以获得monad操作。毕竟Behavior a
在语义上是Time -> a
,即Reader Time
。
同样事件在语义上[(Time, a)]
可以至少给出Applicative
实例,它类似于ZipList
结构。
然而,即使这些在理论上也是可行和优雅的,但在实践中它们很难实现。您可以查看"Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki以获取更多信息。
例如sodium
有kind of monadic bind for Behaviors
:
switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但我们不是在纯类别中工作,而是在Reactive
monad的Kleisli类别中工作。因此,我们可以做更多。
突出困难的一个练习是尝试为ArrowApply
实施Automaton
。 SO provided spoiler