我正在尝试在Haskell中可视化一些简单的自动物理系统(例如摆锤,机器人手臂等).通常这些系统可以用类似的方程来描述
df/dt = c*f(t) + u(t)
其中,u(t)代表了某种"智能控制"的.这些系统看起来非常适合功能反应式编程范例.
因此,我通过保罗·哈达克抓起书"表达的哈斯克尔学校",并发现,领域特定语言"FAL"(功能动画语言)提出有实际工作相当pleasently我简单的玩具系统(虽然某些功能,尤其是integrate,似乎有点懒得有效使用,但很容易修复).
我的问题是,对于今天更先进甚至实际的应用,更成熟,最新,维护良好,性能优化的替代方案是什么?
这个wiki页面列出了Haskell的几个选项,但我不清楚以下几个方面:
"反应"的状态,来自Conal Eliott的项目(据我所知)是这种编程范式的发明者之一,看起来有点陈旧.我喜欢他的代码,但也许我应该尝试其他更新的替代品?在语法/性能/运行时稳定性方面,它们之间的主要区别是什么?
引用2011年的一项调查,第6节," ...... FRP实施仍然没有足够的效率或足够可预测的性能,无法在需要延迟保证的领域中有效使用...... ".Alghough调查提出了一些有趣的可能的优化,鉴于FRP是有超过15年,我得到的印象是,这个性能问题可能会是一件非常,甚至本来就很难在几年内至少解决.这是真的?
该调查的同一位作者在他的博客中谈到了"时间泄漏" .问题是FRP独有的,还是我们在用纯粹的非严格语言编程时通常会遇到的问题?您是否曾经发现,如果性能不够,那么随着时间的推移稳定基于FRP的系统就太难了?
这还是一个研究水平的项目吗?人们喜欢工厂工程师,机器人工程师,金融工程师等实际使用它们(用适合他们需要的各种语言)吗?
虽然我个人更喜欢Haskell实现,但我愿意接受其他建议.例如,拥有一个Erlang实现会特别有趣 - 那么拥有一个智能的,自适应的,自学的服务器进程就很容易了!
我刚刚开始研究Haskell中的功能反应编程世界,我想在反应环境中尝试GUI编程(使用gtk,因为实质性绑定).
现在,我一直在看Grapefruit,Reactive-Banana和Buster,我想要任何证明使用任何一个或其他包装的喜悦/恐惧.
我所拥有的只是这些初步的选择:
我不介意做一些FRP包的绑定给我自己,因为我对抽象的后端想法(Grapefruit有)有一种矛盾的感觉..
虽然我觉得类型理论很有意思,但我也很重视实际程序的简单编码,这似乎让grapfruit记录有点偏离..
也就是说,除非你们当中有些人说服我不这么认为:-)
我一直在比较拉动式FRP(即netwire)和推拉式FRP(即反应性 - 香蕉)在游戏的实施中.一个优于另一个有优势吗?我注意到的事情是:
IO漂浮,这总是更好.我还错过了什么?
编辑,以减少基于意见:主要目标是尽可能具有表达/简洁的东西,没有时间泄漏.
更新:我发现Netwire的一个大问题是,似乎没有一种方便的方法来获得多个帧速率,如"修复你的时间步"一文中所述.
更新2:我解决这个问题的方法是让我的游戏模拟线返回一个Float -> IO ()获取alpha值并使用该alpha插值的所有GL调用.理想情况下,我应该能够通过一个"绘制函数"传递给另一个线程MVar并在该线程中运行它.男人,哈斯克尔太棒了.
更新3:在提出这个问题后的六个月里,我开发了一个基于Netwire 的简单渲染引擎,以及"实体组件编程"的概念.在这个过程中,我实际上没有发现使用FRP非常有用.Wire在某些情况下,s 的表现力实际上已成为障碍.问题集中在对象的"身份"上.在定义Wire类型的值时,它没有标识,即它可以在整个网络中多次重复使用,并且每次表示不同的物理事物.当你想要做一些像碰撞检测这样的事情并且无法遍历场景图时,这是一个巨大的痛苦,因为它不能在不融合成单根不透明线的情况下存在.在"玩具"示例中不会出现此问题,因为很容易准确指定哪些对象与哪些其他对象以哪种方式交互.我相信这是任何一种FRP的问题.
如果一些Haskell向导在这方面证明我错了,那将是很棒的,但我真的没有看到它的方法.此外,如果解释不是很好,我很抱歉,但如果不自己尝试,这并不容易理解.