8

我正在寻找一个库来在 GLFW 和 OpenGL 之上编写一个 GUI。我这样做是因为我对常见的 UI 库绑定感到不满意,我觉得这些绑定过于必要,而且我还希望严格控制我的 UI 的外观和感觉。我想要一种定义 UI 的声明性方法。我正在试验反应香蕉(和暂时反应香蕉wx),看看它是否满足我的需求。我在定义递归小部件时遇到问题。这是我最简单的测试用例:

  • 显示计数器的文本小部件。
  • 增加计数器的按钮小部件。
  • 当计数器为 0 时处于非活动状态(因此它变灰并且根本不响应输入)的按钮小部件,否则处于活动状态并将计数器重置为 0。

第一个和第三个小部件具有递归关系。第一个小部件直观地是从两个按钮提供的事件之一stepperunion但是,重置按钮是fmap计数器的一个,然后事件流依赖于重置按钮!什么是要做?

除了这个问题之外,我还担心事件处理:由于我想在我的代码中处理设备输入和输入焦点,而不是依赖于框架,因此我看到以可扩展方式正确调度事件的困难。理想情况下,我会定义一个data封装小部件的层次结构的方法,一种在元素之间安装事件回调的方法,然后编写一个遍历该数据结构的函数,以定义设备输入处理和图形输出。我不确定如何获取事件流并将其拆分,因为可以合并事件流。

4

1 回答 1

5

允许递归,只要它是 aBehavior和 an之间的相互递归Event。s的好处Behavior是在更新时对它们进行采样将返回旧值。

例如,您的示例可以表示如下

eClick1, eClick2 :: Event t ()

bCounter :: Behavior t Int
bCounter = accumB 0 $ mconcat [eIncrement, eReset]

eIncrement = (+1)      <$ eClick1
eReset     = (const 0) <$ whenE ((> 0) <$> bCounter) eClick2

另请参阅问题“反应香蕉可以处理网络中的循环吗?”


至于您的第二个问题,您似乎正在寻找该功能filterE及其表亲filterApplywhenE


至于你的总体目标,我认为它是相当雄心勃勃的。从我迄今为止获得的少量经验来看,在我看来,绑定到现有框架与在 FRP 中制作“干净状态”框架完全不同。最有可能的是,仍然潜伏着一些未被发现(但令人兴奋!)的抽象。我曾经开始编写一个名为BlackBoard的应用程序,其中包含一个关于时变绘图的很好的抽象。

但是,如果您更关心结果而不是冒险,我会推荐一种保守的方法:以命令式样式创建 GUI 工具包,并在此基础上挂钩 reactive-banana 以获得 FRP 的好处。

如果您只希望使用任何GUI,我目前专注于将 Web 浏览器作为 GUI。这里用姬做一些初步的实验。wxHaskell 的主要好处是它更容易启动和运行,任何 API 设计工作都将使广大受众受益。

于 2012-11-04T11:33:07.310 回答