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

亚历克西斯·金

我一直在阅读《功能性反应式编程》,尽管我没有以任何一种语言广泛使用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的工作原理有一个有效的理解(如果可能简化的话)?

phadej

可以给行为单子操作。毕竟Behavior a是语义Time -> a上的Reader Time

同样,至少在语义上可以赋予事件类似于结构的实例[(Time, a)]ApplicativeZipList

然而,即使这些在理论上也是可能的且优雅的,但实际上它们很难实现。您可以查看Evan Czaplicki撰写的“控制时间和空间:了解FRP的多种表述”以获取更多信息。

例如,sodium具有以下类型的单子绑定Behaviors

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章