8

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函数有更严格的类型?

4

1 回答 1

4

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

考虑由stepper(or accumB) 定义的行为,它恰好在时间t0发生变化。行为此时此刻有什么价值?答案是 Behavior 在严格大于更改时间t > t0的所有时间都采用新值,并且在时间t0仍然具有旧值。换句话说,该changes'函数返回一个事件,其值是更改时行为的旧值。相反,该changes函数返回新的(“未来”)值。由于与递归有关的各种原因,新值被包装在一个类型中,因此直到阶段Future才能访问它们。reactimate'

编辑:托拜厄斯画了一张图来说明:

于 2014-11-18T14:13:03.067 回答