将外部事件注入库中

这个例子并没有绑定任何具体的 GUI 工具包,例如 reactive-banana-wx。相反,它显示了如何将正式的 IO 行动注入 FRP 机制。

Control.Event.Handler 模块提供了 addHandler 功能,可以创建一对 AddHandler aa -> IO () 值。前者由反应香蕉本身用于获得 Event a 值,而后者是用于触发相应事件的普通函数。

import Data.Char (toUpper)

import Control.Event.Handler
import Reactive.Banana

main = do
    (inputHandler, inputFire) <- newAddHandler

在我们的例子中,处理程序的 a 参数是 String 类型,但允许编译器推断的代码将在稍后写入。

现在我们定义描述我们的 FRP 驱动系统的 EventNetwork。这是使用 compile 函数完成的:

main = do
    (inputHandler, inputFire) <- newAddHandler
    compile $ do
        inputEvent <- fromAddHandler inputHandler

fromAddHandler 函数将 AddHandler a 值转换为 Event a,这将在下一个示例中介绍。

最后,我们启动事件循环,它会触发用户输入的事件:

main = do
    (inputHandler, inputFire) <- newAddHandler
    compile $ do
        ...
    forever $ do
        input <- getLine
        inputFire input