功能反应式编程(FRP)可以使用monads表示吗?

时间:2015-02-03 07:50:41

标签: javascript haskell functional-programming reactive-programming monads

我一直在阅读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如何运作的有效(如果可能是简化的)理解?

1 个答案:

答案 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以获取更多信息。

例如sodiumkind of monadic bind for Behaviors

switch :: Behavior (Behavior a) -> Reactive (Behavior a)

但我们不是在纯类别中工作,而是在Reactive monad的Kleisli类别中工作。因此,我们可以做更多。

突出困难的一个练习是尝试为ArrowApply实施AutomatonSO provided spoiler