为什么`changes`返回`Event t(Future a)`

时间:2014-11-17 19:54:49

标签: haskell reactive-banana

changes函数的类型为Frameworks t => Behavior t a -> Moment t (Event t (Future a))Future是抽象的,只有一个函数使用它(reactimate')。

但是,我可以轻松编写以下功能:

changes' :: Frameworks t => Behavior t a -> Moment t (Event t a)
changes' b = fmap (fmap const b <@>) (changes b)

获得正常(非Future)事件。

该功能有问题吗?如果没有,为什么原始的changes函数具有更严格的类型?

1 个答案:

答案 0 :(得分:4)

函数changes返回的值与您描述的函数changes'不同。关键点如下:

考虑由stepper(或accumB)定义的行为,该行为恰好在 t0 时发生变化。行为在这个时刻有什么价值?答案是,行为在严格大于的所有时间都采用新值, t&gt; t0 ,并且它在 t0 时仍然具有旧值。换句话说,changes'函数返回一个事件,其值是更改时行为的旧值。相反,changes函数返回新的(“future”)值。由于与recursion有关的各种原因,新值包含在Future类型中,因此在reactimate'阶段之前无法访问它们。

编辑:托比亚斯画了一张照片说明: