我目前正试图通过Heinrich Apfelmus的reactive-banana来了解FRP,与我看过的其他库相比,它似乎是一个有很好文档和简单的库。
但是,我不能理解AddHandler类型。假设我想使用GLFW来获得鼠标按钮点击,这样我就有了类似eMouseButton :: Event ()的东西。从示例中看,我似乎不得不使用fromAddHandler,但我不知道如何组合AddHandler参数。我想我将不得不以某种方式使用newAddHandler,但是如何使用呢?
我想一个关于如何将reactive-banana连接到wx以外的东西的例子将会有很大的帮助。
发布于 2011-12-26 06:14:29
newAddHandler的用法如下:
do (addHandler, fire) <- newAddHandler
...addHandler是传递给reactive-banana的AddHandler,fire是触发事件的a -> IO ()类型的函数(其中a是您的事件类型)。
例如,您可能会将fire安装为GLFW的鼠标按钮事件的回调函数,如下所示:
registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
(addHandler, fire) <- newAddHandler
setMouseButtonCallback $ \button _ -> fire button
fromAddHandler addHandler(我没有使用GLFW的经验,所以我不确定setMouseButtonCallback回调的第二个参数是什么-如果它很重要,您需要适当地修改这个实现。)
AddHandler只是一个函数,它接受一个回调-- a -> IO () --并为相关事件注册它;然后它(在IO内部)返回一个用于注销该处理程序的IO ()操作,使complete definition of AddHandler如下所示:
type AddHandler a = (a -> IO ()) -> IO (IO ())那么newAddHandler有什么用处呢?简单:newAddHandler维护事件的处理程序列表,并在执行fire x时激活它们。
如果您的工具包已经具有注册和取消注册多个事件处理程序的功能,则不需要newAddHandler;如果有,您应该编写自己的AddHandler实现。但是如果它只支持一个回调,你应该使用newAddHandler。
请注意,您永远不需要使用FRP代码本身向AddHandler公开;它们只是用于从外部输入创建Event的内部粘合剂。
https://stackoverflow.com/questions/8631816
复制相似问题