我一直在阅读《功能性反应式编程》,尽管我没有以任何一种语言广泛使用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的工作原理有一个有效的理解(如果可能简化的话)?
可以给行为单子操作。毕竟Behavior a
是语义Time -> a
上的Reader Time
。
同样,至少在语义上可以赋予事件类似于结构的实例。[(Time, a)]
Applicative
ZipList
然而,即使这些在理论上也是可能的且优雅的,但实际上它们很难实现。您可以查看Evan Czaplicki撰写的“控制时间和空间:了解FRP的多种表述”以获取更多信息。
例如,sodium
具有以下类型的单子绑定Behaviors
:
switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但是我们不是在纯类别中工作,而是在Reactive
monad的Kleisli类别中工作。因此,我们可以做更多的事情。
一个练习,突出的困难,是试图实现ArrowApply
的Automaton
。SO提供的扰流板
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句