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