bzn*_*bzn 14 haskell reactive-programming reactive-banana
我正在尝试通过Heinrich Apfelmus的反应性香蕉来了解FRP ,与我所看到的其他相比,它似乎是一个文档齐全且简单的库.
但是,我无法绕过AddHandler类型.假设我想使用GLFW来获取鼠标按钮,以便我有类似的东西eMouseButton :: Event ()
.看看这些例子,似乎我不得不使用fromAddHandler,但我不知道如何组装该AddHandler
参数.我想我不得不以newAddHandler
某种方式使用,但是怎么样?
我想一个如何连接reactive-banana
到其他东西的例子wx
会有很大帮助.
ehi*_*ird 14
newAddHandler
使用如下:
do (addHandler, fire) <- newAddHandler
...
Run Code Online (Sandbox Code Playgroud)
addHandler
是要传递给的AddHandler reactive-banana
,它fire
是触发事件的类型a -> IO ()
(其中a是您的事件类型)的函数.
例如,您可能会安装fire
为GLFW的鼠标按钮事件的回调,如下所示:
registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
(addHandler, fire) <- newAddHandler
setMouseButtonCallback $ \button _ -> fire button
fromAddHandler addHandler
Run Code Online (Sandbox Code Playgroud)
(我对GLFW没有经验,所以我不确定setMouseButtonCallback
回调的第二个参数是什么 - 如果它很重要,你需要适当地修改这个实现.)
An AddHandler
只是一个接受回调的函数a -> IO ()
- 并为相关事件注册它; 然后它返回(从内部IO
)IO ()
用于取消注册此处理程序的操作,使读取的完整定义AddHandler
如下:
type AddHandler a = (a -> IO ()) -> IO (IO ())
Run Code Online (Sandbox Code Playgroud)
那么newAddHandler
进来的地方呢?简单:newAddHandler
维护事件的处理程序列表,并在fire x
执行时激活它们.
您不需要newAddHandler
像GTK +和许多其他常用工具包一样,您的工具包已经具有注册和注销多个事件处理程序的工具; 如果是这样,你应该编写自己的实现AddHandler
.但如果它支持的只是一个回调,你应该使用newAddHandler
.
请注意,您永远不需要将AddHandler
s 暴露给使用FRP的代码本身; 它们只是用于Event
从外部输入创建s的内部胶水.