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
函数具有更严格的类型?
最佳答案
函数 changes
返回的值与您描述的函数 changes'
不同。关键点如下:
考虑由 stepper
(或 accumB
)定义的行为,它恰好在时间 t0 发生变化。该行为此时此刻有什么值(value)?答案是,行为在所有严格大于于更改时间t > t0的时间中采用新值,并且它仍然具有其旧值在时间t0。换句话说,changes'
函数返回一个事件,其值是行为更改时的旧值。相反,changes
函数返回新的(“ future ”)值。由于各种原因,与recursion有关,新值被包装在 Future
类型中,以便在 reactimate'
阶段之前无法访问它们。
编辑:托比亚斯画了一张图作为说明:
关于haskell - 为什么 `changes` 返回 `Event t (Future a)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980819/