How does functional programming apply to simulations?
除了标题中的一般问题,
- 函数式程序员和函数式语言是如何接近模拟领域的,而模拟领域似乎最自然地由面向对象的语言来处理?
- 是否有以(大部分)功能风格编写的复杂仿真的开源示例?
- 为了从功能范式接近模拟,OO程序员需要什么样的视角变化?
我在学习Clojure的创建者Rich Hickey是如何特别设法驯服OO编程和可变状态的"偶然的复杂性"时提出这个问题的,例如Clojure对身份和状态的分离非常有意义(Hickey的ants.clj在研究列表中)。另一个相关领域是为游戏使用函数式编程,这通常是模拟,在整个地方都有很多有状态的"东西";有一些关于FP和游戏的文章/论文,欢迎更多。
也许经验丰富的函数式程序员可以提供更多的背景和建议,来重新定位一个人的思维,特别是对于模拟来说。事先谢谢!
迈克尔的回答很好,但我想我会再加上几个我个人认为有用/有趣的例子。
第一篇是刘简森的一篇关于功能流体动力学的文章(和代码)。虽然他在这里的速度绝对是可变的,但他的风格相当实用。我敢打赌Clojure 1.3可以做到(大部分!)性能稳定,性能合理。
接下来是在Clojure中实现的一个简单的蛇游戏。一个小时左右就可以轻松读完,而且它的风格真的很愉快,很有凝聚力。
另外,还要看一些整洁的代码(我想!)是代码建模神经网络。JeffFoster有一些单层感知器代码,还有一些更为惯用的代码修订。值得一看,即使你不熟悉NNS。他也有一些关于流体动力学的最近的职位,尽管这次在哈斯克尔。(第一部分和第二部分)我认为,同样有趣的是他对生活游戏的实施(第二部分)。
最后,正如我前面提到的,布赖恩·卡珀正在Clojure做一个RPG。他最近发布了一些游戏的作品,所以我敢打赌它还在开发中;)
我喜欢使用序列库来处理大量的数据;使用像
玩得高兴!
我正在用Clojure写一个游戏,使用的是一种功能性的风格。例如,整个游戏状态被建模为不可变的数据结构。
这需要一些稍微复杂的编码。例如,您经常会创建带有大量参数的函数,以绕过游戏状态的各种元素,并确保最新的游戏版本会发生游戏状态更新的应用程序。
但是它也带来了一些非常好的优势,例如并发性被证明是非常微不足道的,你可以做一些有趣的事情,比如克隆整个游戏状态来在人工智能中运行不同的模拟。
总的来说,我很高兴Clojure作为模拟/游戏的语言。
基于这一经验,我认为可以改进Clojure的游戏/模拟功能的是:
- 更好地支持原语,尤其是作为函数参数和返回值
- 实现对内存分配不那么困难的核心语言功能(GC压力是交互式游戏的一个问题!)
你可以在这里看到游戏的早期版本:铁甲将军蒸汽。这基本上是一个以蒸汽朋克为主题的战略游戏。
我不确定我是否有能力对问题中提出的问题进行全面的分析,但我至少可以在FP和Games Front上发布一些有趣的链接:
J?RG W.Mittag在回答关于"现实世界"haskell编程的一个问题时提供了许多有趣的例子(链接到一些有趣的文章——纯功能的回溯系列确实值得一读)。
在ClojureLand,PhilHagelberg已经为他的关于Clojure编程的Peepcode屏幕广播实现了一个基于文本的冒险游戏;该代码在Github上可用。接下来是Brian Carper的RPG项目;还没有公开发布任何代码,只是不久前发布的一篇文章(看起来很酷,所以让我们一起向Brian施压继续;-)。最后,这里是一个使用半影的简单游戏的例子(出于某种原因——可能与Clojure无关——我不能让它工作,但希望你能,另外还有一个附加说明)。
至于模拟,研究
为了补充其他答案:有一个称为功能反应式编程的学科,它解决了系统的功能表示问题,这些系统会随着时间的变化而变化,并对外部事件作出反应。见
- 什么是(功能性)反应式编程?
- 功能性图形用户界面编程是否可行?
- haskell wiki上的函数式反应式编程。
鲍勃叔叔最近一直在玩Clojure,特别是写一个轨道模拟器作为他最公开的例子。
一些链接:
- 博客帖子
- GITHUB代码
模拟是解释器的一种形式——很容易用函数式编写。它们也可以设计为自优化模拟器,基于将它们视为编译器。