dan*_*raj 8 user-interface haskell frp reactive-banana
我正在寻找一个库来在GLFW和OpenGL之上编写GUI.我这样做是因为我对常见的UI库绑定不满意,我认为这些绑定太过于必要,而且我也希望严格控制UI的外观和感觉.我想要一种定义UI的声明方法.我正在尝试使用反应性香蕉(以及临时反应性香蕉-wx)来确定它是否符合我的需求.我在定义递归小部件时遇到问题.这是我最简单的测试用例:
第一个和第三个小部件具有递归关系.第一个小部件直观地是从两个按钮馈送的事件中stepper的一个union.但是,重置按钮是fmap计数器的一个,然后事件流依赖于重置按钮!什么是要做?
除了这个问题,我还关注事件处理:由于我想在我的代码中处理设备输入和输入焦点而不是依赖于框架,我发现在以可伸缩的方式正确调度事件方面存在困难.理想情况下,我将定义一个data封装窗口小部件的层次结构,一种在元素之间安装事件回调的方法,然后编写遍历该数据结构的函数,以便定义设备输入处理和图形输出.我不确定如何获取事件流并将其拆分为可以合并事件流.
允许递归,只要它是a Behavior和a之间的相互递归Event.关于Behaviors的好处是在更新时对它们进行采样将返回旧值.
例如,您的示例可以表示如下
eClick1, eClick2 :: Event t ()
bCounter :: Behavior t Int
bCounter = accumB 0 $ mconcat [eIncrement, eReset]
eIncrement = (+1) <$ eClick1
eReset = (const 0) <$ whenE ((> 0) <$> bCounter) eClick2
Run Code Online (Sandbox Code Playgroud)
至于你的第二个问题,你似乎在寻找的功能filterE和它的表兄弟filterApply和whenE?
至于你的总体目标,我认为这是一个雄心勃勃的目标.从迄今为止我获得的经验来看,在我看来,绑定到现有框架与在FRP中构建"清洁状态"框架完全不同.最有可能的是,仍有一些未被发现的(但令人兴奋的!)抽象潜伏在那里.我曾经开始编写一个名为BlackBoard的应用程序,其中包含一个关于时变图的很好的抽象.
但是,如果您更关心结果而不是冒险,我会建议采用保守的方法:以命令式方式创建GUI工具包,并在此基础上使用hook-banana来获得FRP的好处.
如果您只是希望使用任何 GUI,我目前将重点放在Web浏览器上作为GUI.这里有一些初步实验.与wxHaskell相比的主要优点是,它更易于启动和运行,任何API设计工作都将使广大受众受益.