功能反应式编程(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的“控制时空:了解玻璃钢的许多配方”以获取更多信息。
例如, sodium
对Behaviors
有一种单调的结合:
switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但我们不是在纯粹的类别中工作,而是在克里斯里类别的Reactive
monad中工作。 因此,我们可以做更多。
一个突出困难的练习是尝试实现ArrowApply
for Automaton
。 SO提供了扰流器
上一篇: Can functional reactive programming (FRP) be expressed using monads?