函数式反应式编程 (FRP) 可以用 monad 表达吗?
Can functional reactive programming (FRP) be expressed using monads?
我一直在阅读 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 工作原理的有效(如果可能是简化的)理解?
行为 可以被赋予 monad 操作。毕竟 Behavior a
在语义上是 Time -> a
,也就是 Reader Time
.
另外 Events 在语义上 [(Time, a)]
至少可以给出 Applicative
类似于 ZipList
结构的实例。
然而,即使这些在理论上可行且优雅,但在实践中却很难实现。您可以查看 "Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki 了解更多信息。
例如sodium
have kind of monadic bind for Behaviors
:
switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但我们不是在纯类别中工作,而是在 Reactive
monad 的 Kleisli 类别中工作。因此我们可以做更多。
一个突出困难的练习是尝试实施ArrowApply
for Automaton
. SO provided spoiler
我一直在阅读 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 工作原理的有效(如果可能是简化的)理解?
行为 可以被赋予 monad 操作。毕竟 Behavior a
在语义上是 Time -> a
,也就是 Reader Time
.
另外 Events 在语义上 [(Time, a)]
至少可以给出 Applicative
类似于 ZipList
结构的实例。
然而,即使这些在理论上可行且优雅,但在实践中却很难实现。您可以查看 "Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki 了解更多信息。
例如sodium
have kind of monadic bind for Behaviors
:
switch :: Behavior (Behavior a) -> Reactive (Behavior a)
但我们不是在纯类别中工作,而是在 Reactive
monad 的 Kleisli 类别中工作。因此我们可以做更多。
一个突出困难的练习是尝试实施ArrowApply
for Automaton
. SO provided spoiler