事件类型
在反应性香蕉中,Event
类型代表了一些事件的及时流。Event
类似于模拟脉冲信号,因为它在时间上不连续。因此,Event
只是 Functor
类型类的一个实例。你不能将两个 Event
组合在一起,因为它们可能会在不同时间点火。你可以用 Event
的[当前]值做一些事情并用一些 IO
动作做出反应。
使用 fmap
完成 Event
s 值的转换:
main = do
(inputHandler, inputFire) <- newAddHandler
compile $ do
inputEvent <- fromAddHandler inputHandler
-- turn all characters in the signal to upper case
let inputEvent' = fmap (map toUpper) inputEvent
对 Event
的反应也是以同样的方式完成的。首先你用 a -> IO ()
类型的动作然后将它传递给 reactimate
函数:
main = do
(inputHandler, inputFire) <- newAddHandler
compile $ do
inputEvent <- fromAddHandler inputHandler
-- turn all characters in the signal to upper case
let inputEvent' = fmap (map toUpper) inputEvent
let inputEventReaction = fmap putStrLn inputEvent' -- this has type `Event (IO ())
reactimate inputEventReaction
现在每当调用 inputFire "something"
时,都会打印出 SOMETHING
。