gpt4 book ai didi

haskell - react 香蕉:如何创建一个 AddHandler?

转载 作者:行者123 更新时间:2023-12-03 22:28:58 27 4
gpt4 key购买 nike

我目前正在尝试通过 Heinrich Apfelmus 的 reactive-banana 了解 FRP ,与我看过的其他库相比,它似乎是一个文档齐全且简单的库。

但是,我无法理解 AddHandler类型。假设我想使用 GLFW获得鼠标按钮点击,这样我就有了 eMouseButton :: Event () 之类的东西.查看示例,我似乎不得不使用 fromAddHandler ,但我不知道如何组装 AddHandler争论。我想我必须使用 newAddHandler不知何故,但如何?

我猜一个如何连接的例子reactive-bananawx 以外的东西会有很大帮助。

最佳答案

newAddHandler像这样使用:

do (addHandler, fire) <- newAddHandler
...
addHandler是要传递给 reactive-banana 的 AddHandler , 和 firea -> 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如果像 GTK+ 和许多其他常用工具包一样,您的工具包已经具备注册和注销多个事件处理程序的功能;如果是这样,您应该编写自己的 AddHandler 实现.但是如果它只支持一个回调,你应该使用 newAddHandler .

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

关于haskell - react 香蕉:如何创建一个 AddHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com