行為型別

為表示連續訊號,反應性香蕉特徵為 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。這背後的基本原理可以從文件中獲得。