行为类型
为表示连续信号,反应性香蕉特征为 Behavior a 型。与 Event 不同,Behavior 是一个 Applicative,它允许你使用 n-ary 纯函数组合 n Behaviors(使用 <$> 和 <*>)。
要从 Event a 获得 Behavior a,有 accumE 功能:
main = do
(inputHandler, inputFire) <- newAddHandler
compile $ do
...
inputBehavior <- accumE "" $ fmap (\oldValue newValue -> newValue) inputEvent
accumE 获取 Behavior 的初始值和 Event,其中包含一个将其设置为新值的函数。
与 Events 一样,你可以使用 fmap 来处理当前的 Behaviors 值,但你也可以将它们与 (<*>) 结合使用。
main = do
(inputHandler, inputFire) <- newAddHandler
compile $ do
...
inputBehavior <- accumE "" $ fmap (\oldValue newValue -> newValue) inputEvent
inputBehavior' <- accumE "" $ fmap (\oldValue newValue -> newValue) inputEvent
let constantTrueBehavior = (==) <$> inputBehavior <*> inputBehavior'
为了对 Behavior 的变化作出反应,有一个 changes 功能:
main = do
(inputHandler, inputFire) <- newAddHandler
compile $ do
...
inputBehavior <- accumE "" $ fmap (\oldValue newValue -> newValue) inputEvent
inputBehavior' <- accumE "" $ fmap (\oldValue newValue -> newValue) inputEvent
let constantTrueBehavior = (==) <$> inputBehavior <*> inputBehavior'
inputChanged <- changes inputBehavior
唯一需要注意的是 changes 返回 Event (Future a) 而不是 Event a。因此,应该使用 reactimate'代替 reactimate。这背后的基本原理可以从文档中获得。