函数式反应式编程 (FRP) 可以用 monad 表达吗?

Can functional reactive programming (FRP) be expressed using monads?

我一直在阅读 Functional Reactive Programming,虽然我没有在任何语言中广泛使用 monad,但我情不自禁地看到它们 无处不在 FRP 设计。

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 工作原理的有效(如果可能是简化的)理解?

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

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

然而,即使这些在理论上可行且优雅,但在实践中却很难实现。您可以查看 "Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki 了解更多信息。

例如sodium have kind of monadic bind for Behaviors

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

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

一个突出困难的练习是尝试实施ArrowApply for Automaton. SO provided spoiler