haskell - active 香蕉 : Bindings

标签 haskell frp reactive-banana

我正在开发一个基于终端的小型 UI,我想使用 Reactive Banana 来描述交互。我唯一感兴趣的外部事件是用户是否按下了某个键。

根据我从 Frameworks 文档中收集到的信息,我可以使用轮询来获取终端输入缓冲区的状态,或者将“事件处理程序”传递给 Reactive Banana。我更喜欢后者,但我发现事件处理部分令人困惑。我将如何准确描述 getChar 的事件驱动版本?最后,我想对“Event Key”流进行操作。

我查看了 SDL 和 wx 绑定(bind),但我没有发现它们有多大帮助,因为它们充斥着与库相关的特性,我非常希望能更简洁地解释事件处理程序、事件循环和 react 性香蕉混合在一起。

最佳答案

事实证明,使用 Reactive Banana 处理外部事件非常灵活和简单。所需要的只是用“newAddHandler”创建一个事件处理程序,它由两部分组成,一个“AddHandler”,可以使用 reactimate 函数从中创建事件,以及一个必须由胶水代码(绑定(bind))调用的处理程序将 Reactive Banana 连接到框架(在我的例子中,我只是将 getChar 的结果提供给处理程序)。

这是一个回显击键的示例代码:

echo = do
  (keyEventHandler, fire) <- newAddHandler

  -- Network Specification (echo keyboard input)
  let networkDescription =
      fromAddHandler keyEventHandler >>= -- Create event stream from handler
      reactimate . fmap print -- Map print over event stream

  compile networkDescription >>= actuate 

  -- Event Loop
  hSetBuffering stdin NoBuffering   
  forever $ do
      ready <- hReady stdin
      if ready
          then getChar >>= fire -- Create keyboad event
          else return ()

reactive banana 的好处在于可以从任何上下文调用回调函数“fire”。因此,事件循环也可以在线程中运行或从 C 库中调用。海因里希对 How to implement a game loop in reactive-banana? 的回答可以找到更多相关信息。 .

然而,在不进行轮询的情况下捕获任意键盘输入事件并不像我想象的那么容易,POSIX 不允许这样做(如果我没记错的话),即使这样做代码也不可移植。 另请注意,在 Windows 机器上,您必须按回车键,我仍然需要找到解决该问题的方法。有关此问题的更多信息,请参见 at the Haskell bugtracker

关于haskell - active 香蕉 : Bindings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44639908/

相关文章:

haskell - 行为是共生体吗?

haskell - FRP - 事件流和信号 - 仅使用信号会丢失什么?

haskell - 使用泛型实现应用构建器风格

haskell - haskell 中的 lambda 单位是什么?

functional-programming - Date.now引用透明吗?

unit-testing - Reactive Banana 1.0.0 - MomentIO() Monad 中的单元测试

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

list - 浏览 Haskell 中的列表拆分功能

haskell - 什么时候泛型类型不是 monad?

haskell - 在 haskell 中传输状态变化的好的包装器有哪些?