Events 将交互添加到场景图中(在Haskell中)

Events 将交互添加到场景图中(在Haskell中),events,haskell,callback,event-handling,scenegraph,Events,Haskell,Callback,Event Handling,Scenegraph,我在Haskell中制作了一个场景图功能渲染引擎,我想知道如何在混合中添加交互 起初,我认为我可以让另一个处理程序节点接收其他节点中的一个,然后对其应用一些IOREF。例如,如果我有 x,y,z <- IORef 0 KeyboardHandler KeyboardCallBack $ Translate x y z $ Object 这样做是可能的,还是我完全走错了路?这种方法可能有效,但有更好的方法。我特别喜欢用一种叫做 TQueue是事务队列的缩写;您可以将事件从渲染线程传递到其中

我在Haskell中制作了一个场景图功能渲染引擎,我想知道如何在混合中添加交互

起初,我认为我可以让另一个处理程序节点接收其他节点中的一个,然后对其应用一些IOREF。例如,如果我有

x,y,z <- IORef 0
KeyboardHandler KeyboardCallBack $ Translate x y z $ Object

这样做是可能的,还是我完全走错了路?

这种方法可能有效,但有更好的方法。我特别喜欢用一种叫做

TQueue
是事务队列的缩写;您可以将事件从渲染线程传递到其中,然后从绘图线程读取它们。这样你就可以把它们当作一个简单、纯粹的价值来处理;事件列表


一般来说,Haskell倾向于对可变状态进行纯操作。可用的渲染框架强调将逻辑状态转换为屏幕上的内容。在这种情况下,类似于
状态OSG
的monad可能还可以。

我不确定我是否理解它。因此,我假设我不会使用IORefs(理想情况下,我宁愿不使用)。不过,我不确定如何在场景图中使用它们。我将如何实现这些目标?谢谢,顺便说一句@Gentatsu
TQueue
是一个聪明的
IORef
包装器。不过,我仍然不确定如何实际使用它?GLFW-b示例似乎非常具体,因此我不确定如何将其抽象出来。
KeyboardHandler keyboard drawable -> case drawable of 
Translate x y z _ -> do 
(Char 'q') -> x $~! (-1)
(Char 'w') -> x $~! (+1)
(Char 'a') -> y $~! (-1)
(Char 's') -> y $~! (+1)
(Char 'z') -> z $~! (-1)
(Char 'x') -> z $~! (+1)
render drawable