反应性香蕉中的行为

Mas*_*sse 12 haskell reactive-programming reactive-banana

对不起,我刚刚开始研究反应性香蕉和玻璃钢.

反应香蕉的作者根据我的建议制作了这个例子,他创造了一个可以增加和减少的计数器.他使用累积函数来累积事件.我想我能够在某种程度上了解事件类型,并能够用它测试很多东西,但后来我记得还有行为.我调查了一下,但似乎这种行为意味着在类似的情况下使用; 修改现有变量,就像accumE对事件一样.

行为意味着什么,它的用例是什么?

Con*_*nal 11

我同意Ankur而不是Chris:文本框是一个随时间变化的值,因此自然希望成为一种行为而不是一种事件.克里斯为不太自然的事件选择提供的理由是实施问题,因此(如果准确的话)是反应性香蕉实施的一个不幸的人为因素.我更倾向于看到实现得到了改进而不是非自然地使用的范例.

除了语义契合,这是务实的非常有用的选择BehaviorEvent.例如,您可以使用Applicative操作(例如liftA2)将时变文本框值与其他时变值(行为)组合在一起.


Chr*_*ith 7

在语义上,你有

Behavior a = Time -> a
Run Code Online (Sandbox Code Playgroud)

也就是说,a Behavior aa随时间变化的类型的值.在一般情况下,你一无所知约一个Behavior a会改变,所以它原来是一个按钮的点击更新文本字段一个相当糟糕的选择.也就是说,在计数器示例中获得表示数字当前值的行为很容易.只需stepper在事件流上使用,或者以相同的方式从头开始构建它,除非使用accumB而不是accumE.

通常,您连接到输入和输出的内容将始终为Events,因此Behavior在内部用于中间结果.

假设在给定的示例中,您想要添加一个记住当前值的新按钮,就像简单计算器上的记忆功能一样.您可以通过为记住的值添加内存按钮和文本字段来开始:

bmem    <- button f [text := "Remember"]
memory  <- staticText f []
Run Code Online (Sandbox Code Playgroud)

您需要能够随时询问当前值,因此在您的网络中,您将添加一种行为来表示它.

let currentVal = stepper 0 counter
Run Code Online (Sandbox Code Playgroud)

然后,您可以挂钩事件,并apply在每次按下"记住"按钮时用于读取行为的值,并生成具有该值序列的事件.

emem <- event0 bmem command
let memoryE = apply (const <$> currentVal) emem
Run Code Online (Sandbox Code Playgroud)

最后,将这个新事件连接到输出

sink memory [text :== ("", show <$> memoryE)]
Run Code Online (Sandbox Code Playgroud)

如果你想在内部使用内存,那么你也想要一个Behaviorfor的当前值......但由于我们只使用它来连接它到输出,我们现在只需要一个事件.

这有帮助吗?


Hei*_*mus 6

图书馆作者发言.:-)

显然,克里斯史密斯可以阅读思想,因为他准确地描述了我的想法.:-)

但是ConalArthur也有一点意见.从概念上讲,计数器是一个随时间变化的值,而不是一系列事件发生.因此,将其视为Behavior更合适.

不幸的是,行为没有任何关于何时会发生变化的信息,而是"仅民意调查".现在,我可以尝试实现各种巧妙的方案,这将最小化轮询,从而允许GUI元素的有效更新.(Conal在原始论文中做了类似的事情.)但我采用了"没有魔法"的理念:图书馆用户应负责通过事件自己管理更新.

我目前设想的解决方案是提供一个第三个之外型EventBehavior,即Reactive(名称如有更改),这体现了双方的特质:从概念上讲,它是随时间变化的值,但它也附带了一个变化的通知事件.一种可能的实施方式是

type Reactive a = (a,Event a)

changes :: Reactive a -> Event a
changes (_, e) = e

value :: Reactive a -> Behavior a
value   (x, e) = stepper x e
Run Code Online (Sandbox Code Playgroud)

毫无疑问,这正是sink预期的类型.这将包含在反应香蕉库的未来版本中.

编辑:我已经发布了反应香蕉版本0.4,其中包括新类型,现在称为Discrete.


Ank*_*kur 5

通常,行为是在一段时间内发生变化的值.它是一个连续值,其中事件是离散值.在行为的情况下,始终存在值.例如:文本框上的文本是行为,因为文本可以在一段时间内更改但是会有一个当前值,其中作为事件中的键盘笔划,因为您无法查询键盘笔划的"当前"值.