行為型別
為表示連續訊號,反應性香蕉特徵為 Behavior a
型。與 Event
不同,Behavior
是一個 Applicative
,它允許你使用 n-ary 純函式組合 n Behavior
s(使用 <$>
和 <*>
)。
要從 Event a
獲得 Behavior a
,有 accumE
功能:
main = do
(inputHandler, inputFire) <- newAddHandler
compile $ do
...
inputBehavior <- accumE "" $ fmap (\oldValue newValue -> newValue) inputEvent
accumE
獲取 Behavior
的初始值和 Event
,其中包含一個將其設定為新值的函式。
與 Event
s 一樣,你可以使用 fmap
來處理當前的 Behavior
s 值,但你也可以將它們與 (<*>)
結合使用。
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
。這背後的基本原理可以從文件中獲得。