行为类型

为表示连续信号,反应性香蕉特征为 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。这背后的基本原理可以从文档中获得。