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

Ale*_*ing 12 javascript monads haskell functional-programming 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
Run Code Online (Sandbox Code Playgroud)

或者FRP还有比我理解的更多吗?是否存在使用monad阻止使用这种简单表示的范例?或者这是对FRP如何运作的有效(如果可能是简化的)理解?

pha*_*dej 11

行为可以给予monad操作.毕竟Behavior a是语义上的Time -> a,这是Reader Time.

此外,语义上的事件[(Time, a)]至少可以给出Applicative类似于ZipList结构的实例.

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

例如,sodium一种 monadic绑定Behaviors:

switch :: Behavior (Behavior a) -> Reactive (Behavior a)
Run Code Online (Sandbox Code Playgroud)

但我们不是在纯粹的类别中工作,而是在Kleisli类别的Reactivemonad中工作.因此我们可以做得更多.

一个练习,突出的困难,是试图实现ArrowApplyAutomaton.SO提供了扰流板