首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应式香蕉:如何创建AddHandler?

反应式香蕉:如何创建AddHandler?
EN

Stack Overflow用户
提问于 2011-12-26 06:06:58
回答 1查看 837关注 0票数 14

我目前正试图通过Heinrich Apfelmus的reactive-banana来了解FRP,与我看过的其他库相比,它似乎是一个有很好文档和简单的库。

但是,我不能理解AddHandler类型。假设我想使用GLFW来获得鼠标按钮点击,这样我就有了类似eMouseButton :: Event ()的东西。从示例中看,我似乎不得不使用fromAddHandler,但我不知道如何组合AddHandler参数。我想我将不得不以某种方式使用newAddHandler,但是如何使用呢?

我想一个关于如何将reactive-banana连接到wx以外的东西的例子将会有很大的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-26 06:14:29

newAddHandler的用法如下:

代码语言:javascript
复制
do (addHandler, fire) <- newAddHandler
   ...

addHandler是传递给reactive-banana的AddHandler,fire是触发事件的a -> IO ()类型的函数(其中a是您的事件类型)。

例如,您可能会将fire安装为GLFW的鼠标按钮事件的回调函数,如下所示:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
type AddHandler a = (a -> IO ()) -> IO (IO ())

那么newAddHandler有什么用处呢?简单:newAddHandler维护事件的处理程序列表,并在执行fire x时激活它们。

如果您的工具包已经具有注册和取消注册多个事件处理程序的功能,则不需要newAddHandler;如果有,您应该编写自己的AddHandler实现。但是如果它只支持一个回调,你应该使用newAddHandler

请注意,您永远不需要使用FRP代码本身向AddHandler公开;它们只是用于从外部输入创建Event的内部粘合剂。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8631816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档