事件型別

在反應性香蕉中,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