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

我一直在阅读Functional Reactive Programming,虽然我没有广泛地使用monad,但我不禁要在FRP设计中的任何地方看到它们。

这个问题的答案对功能性反应式编程有一些奇妙的描述,而且我不会试图在这里复制它。 基本上,FRP会在随时间变化的值之间建立关系。

那么这不能一次表示吗? 将需要随时间修改的值封装在monad中,将其称为Signal ,然后像这样使用这些信号(为简单起见,使用Haskell do-notation)。

do
  mx <- mouseX
  my <- mouseY
  wave <- currentTime >>= liftM sin
  -- do some stuff with these values

还是有更多的FRP比我理解? 是否有范例阻止使用单子的简单表示? 或者这对于FRP的工作原理是否有效(如果可能是简化的话)?


行为可以被赋予monad操作。 毕竟Behavior a在语义上是Time -> a ,即Reader Time

也可以在语义上[(Time, a)]至少给出与ZipList结构类似的Applicative实例。

然而,即使这些在理论上是可能的和优雅的,但实际上它们很难实施。 您可以查看Evan Czaplicki的“控制时空:了解玻璃钢的许多配方”以获取更多信息。

例如, sodiumBehaviors有一种单调的结合:

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

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

一个突出困难的练习是尝试实现ArrowApply for Automaton 。 SO提供了扰流器

链接地址: http://www.djcxy.com/p/47727.html

上一篇: Can functional reactive programming (FRP) be expressed using monads?

下一篇: Implementing reactive programming/functions in c#