事件类型

在反应性香蕉中,Event 类型代表了一些事件的及时流。Event 类似于模拟脉冲信号,因为它在时间上不连续。因此,Event 只是 Functor 类型类的一个实例。你不能将两个 Event 组合在一起,因为它们可能会在不同时间点火。你可以用 Event 的[当前]值做一些事情并用一些 IO 动作做出反应。

使用 fmap 完成 Events 值的转换:

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