函数式响应式编程(FRP)可以使用单子来表达吗?

14

我一直在研究函数响应式编程,尽管我没有在任何语言中广泛使用过单子,但我不禁发现它们在FRP设计中随处可见。

这个问题的回答中有一些关于函数响应式编程的绝妙描述,我不会在这里尝试复制那些内容。基本上,FRP创建了随时间变化的值之间的关系。

那么这不能用单子来表示吗?将需要修改的值的代码封装在一个单子中,称之为Signal,然后像这样使用这些信号(使用Haskell do-notation以简化)。

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

FRP是否还有我没有理解的东西?是否有范式阻止使用像单子这样简单的表示形式?或者这是FRP工作方式的一个有效(如果可能有些简化)理解?


1
Arrow是与FRP相关的更抽象的概念,您应该首先了解它,然后您会发现单子方法不太可取。请参考以下链接:https://www.haskell.org/arrows/ https://wiki.haskell.org/Arrows-based_Functional_Reactive_Programming 还有一篇名为“Arrows, Robots, and Functional Reactive Programming”的文章,请访问http://haskell.cs.yale.edu/?post_type=publication&p=175。 - sigrlami
@Sigrlami 我承认我还没有花时间去理解箭头,但是谢谢你提供的链接。我会去看看的。 - Alexis King
在JavaScript中,FRP的一个非常简单的定义难道不是将所有数据都视为流吗?肯定有一个流单子,所以FRP不就是使用特定(非常强大)的单子进行编程吗? - Alfred Young
1个回答

12

Behaviors 可以被赋予单子操作。毕竟,Behavior a 语义上是 Time -> a,这等同于 Reader Time

另外,语义上为 [(Time, a)]Events 至少可以拥有类似于 ZipList 结构的 Applicative 实例。

然而,即使这些在理论上是可能且优雅的,在实践中它们很难实现。您可以查看 Evan Czaplicki 的《Controlling Time and Space: understanding the many formulations of FRP》以获取更多信息。

例如,sodiumBehaviors 提供了一种类似于单子绑定的机制:一种单子绑定机制

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

但是我们不是在纯范畴中工作,而是在Reactive单子的Kleisli范畴中工作。因此我们可以做更多事情。

一个突出困难的练习是尝试为Automaton实现ArrowApplySO提供了提示


那次讲座对于像我这样不太了解Haskell高阶抽象的人特别有帮助。感谢您的解释! - Alexis King

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接