【问题标题】:Can functional reactive programming (FRP) be expressed using monads?功能反应式编程(FRP)可以使用单子来表达吗?
【发布时间】:2015-04-02 08:22:26
【问题描述】:

我一直在阅读 Functional Reactive Programming,虽然我没有在任何语言中广泛使用过 monad,但我还是忍不住在 FRP 设计中随处可见

This question's answers 对什么是函数式响应式编程 有一些精彩的描述,我不会在这里尝试复制。基本上,FRP 会在随时间变化的值之间创建关系。

所以这不能用一元表示吗?将需要随时间修改的值的代码封装在一个 monad 中,将其命名为 Signal,然后像这样使用这些信号(为简单起见,使用 Haskell do-notation)。

do
  mx <- mouseX
  my <- mouseY
  wave <- currentTime >>= liftM sin
  -- do some stuff with these values

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

【问题讨论】:

标签: javascript haskell functional-programming reactive-programming monads


【解决方案1】:

行为可以被赋予单子操作。毕竟Behavior a在语义上就是Time -&gt; a,也就是Reader Time

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

然而,即使这些在理论上是可行且优雅的,但在实践中却很难实现。您可以查看"Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki 了解更多信息。

例如sodiumkind of monadic bind for Behaviors

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

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

突出困难的一个练习是尝试为Automaton 实现ArrowApplySO provided spoiler

【讨论】:

  • 那次演讲对于像我这样对 Haskell 高阶抽象的错综复杂的人来说特别有帮助。谢谢你的解释!
猜你喜欢
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2011-07-20
相关资源
最近更新 更多