函数反应式编程(FRP)可以用单子来表达吗?
Can functional reactive programming (FRP) be expressed using monads?
我一直在阅读函数式响应式编程,虽然我没有在任何语言中广泛使用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的许多配方"以获取更多信息。
例如,sodium
对Behaviors
有某种一元绑定:
switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但我们不是在纯范畴中工作,而是在Reactive
monad的克莱斯利范畴中工作。因此,我们可以做得更多。
突出困难的一个做法是尝试为Automaton
实施ArrowApply
。SO 提供的剧透
相关文章:
- 使用代码了解 JavaScript 中的反应式扩展
- 如何使metrojs反应式froala编辑器在其值更改时进行更新
- 函数反应式编程(FRP)可以用单子来表达吗?
- 在 DOM 被反应式模板数据更改后,Meteor 调用 JS
- 更改 ul 列表中的反应式链接
- 流星反应式嵌套对象更新父对象
- JS中的反应式流如何工作
- MeteorJS和x可编辑反应式模板
- 流星,更新时的反应式数组渲染问题
- 反应式,<输入>上的两个绑定
- 当$scope更改时重新运行反应式帮助程序
- 如何将 SlickGrid 与 Meteor.js 反应式集合集成
- React(来自Facebook的应用程序框架)和react.js(JS的反应式扩展)之间有什么区别/相似之处
- 流星:我可以在模板助手之外使用反应式变量吗?
- Angular的反应式下拉菜单
- 将结构化的反应式数据发布到客户端(在数据库集合之外)
- 反应式编程与事件驱动编程有何不同
- 创建反应式阵列会话存储
- 如何在RxJS中实现时间到期热可观察(或在反应式扩展中通用)
- 如何使对象阵列成为反应式数据源