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

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

本文关键字:编程 反应式 FRP 函数      更新时间:2023-09-26

我一直在阅读函数式响应式编程,虽然我没有在任何语言中广泛使用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)]的事件至少可以给出Applicative类似于结构ZipList实例。

然而,即使这些在理论上是可能的和优雅的,在实践中它们也很难实现。您可以查看Evan Czaplicki的"控制时间和空间:了解FRP的许多配方"以获取更多信息。

例如,sodiumBehaviors某种一元绑定:

switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但我们不是在纯范畴中工作

,而是在Reactive monad的克莱斯利范畴中工作。因此,我们可以做得更多。

突出困难的一个做法是尝试为Automaton实施ArrowApply。SO 提供的剧透