函数式编程如何应用于模拟?

时间:2010-08-07 18:58:43

标签: functional-programming clojure simulation

除了标题中的一般问题外,

  • 功能程序员和函数式语言如何接近模拟领域,这些领域似乎最自然地由面向对象语言处理?
  • 是否有以(主要)功能风格编写的复杂模拟的开源示例?
  • 为了从功能范式接近模拟,OO程序员需要改变什么样的观点?

在问及Clojure的创作者Rich Hickey如何特别寻求驯服OO编程和可变状态的“偶然复杂性”时,我问这个问题。 Clojure的身份和状态分离很有意义(Hickey的ants.clj在研究列表中)。另一个相关的领域是使用游戏的函数式编程,这些游戏通常是模拟整个地方有很多有状态的“事物”;有一些关于FP和游戏的文章/论文,欢迎更多。

也许有经验的函数式程序员可以提供额外的背景和建议,如何将一个人的思维重新定位到功能风格,特别是模拟。提前谢谢!

6 个答案:

答案 0 :(得分:5)

Michal的答案非常好,但我想我会添加一些我个人认为有用/有趣的其他简洁例子。

首先是Lau Jenson关于functional fluid dynamics的帖子(和代码)。虽然他肯定会在这里采用可变的速度路线,但风格相当实用。我敢打赌Clojure 1.3这可以完成(主要是!)不可改变的,具有合理的性能。

接下来是在Clojure中实现的simple Snake game。虽然在一个小时左右的时间内阅读起来很容易,但风格非常舒适和凝聚力。

此外,一些简洁的代码(我认为!)是代码建模神经网络。 Jeff Foster有一些single layer感知器代码,还有一些idiomatic revisions of the code。值得一看,即使你不熟悉NN。他还有一些关于流体动力学的最新帖子,尽管这次是在Haskell。 (Part IPart II)我认为,同样有趣的是implementation of the Game of Life(& Part II)。

最后,正如Michal在我之前提到的,Brian Carper正在研究a RPG in Clojure。他为游戏recently posted some artwork,所以我打赌它仍在继续;)

我喜欢使用序列库来处理大量数据;使用像mapreduce这样的抽象,以及像juxt这样有趣,方便的工具而不是简单的命令式迭代,感觉更自然。我发现,通过使用Clojure /功能语言重新实现众所周知且实施良好的命令式算法,您确实需要缴纳税款。

玩得开心!

答案 1 :(得分:4)

我不确定我是否能够对问题中提出的问题进行全面分析,但我至少可以在FP与游戏方面发布一些有趣的链接:

JörgW。Mittag在this answer中提供了许多关于“真实世界”Haskell编程问题的有趣例子(链接到一些有趣的文章 - Purely Functional Retrogames系列真的很值得阅读)。

在Clojure的土地上,Phil Hagelberg为他的PeepCode Clojure编程截屏录制了一个基于文本的冒险游戏;代码可用on GitHub。然后是Brian Carper的RPG project;没有公开发布的代码和刚刚发布的那篇文章(虽然看起来非常酷,所以让我们共同迫使Brian继续下去;-))。最后,here是一个使用Penumbra的简单游戏的例子(出于某种原因 - 可能与Clojure无关 - 我无法让它工作,但是你可能会这样做,另外还有一个附加的文章)。

至于模拟,研究ants.clj是个好主意。另外,我记得在加州大学伯克利分校(我认为......?)的入门编程课程中可以看到一系列基于SICP的讲座(90%来自他们的YouTube频道);他们在Scheme中有三个关于OOP的讲座,我认为他们提到模拟作为一个领域,为该方法提供了良好的用例。请注意,我对这个内容非常模糊,所以我很难说它对你有多大用处。

答案 2 :(得分:4)

我正在用Clojure编写游戏,使用的功能主要是功能性的。例如,整个游戏状态被建模为不可变数据结构。

这需要一些稍微复杂的编码。例如,您经常最终创建具有大量参数的函数来传递游戏状态的各种元素,并确保在最新的游戏版本中应用游戏状态更新。

但它也带来了一些非常好的优点,例如并发已经证明是非常微不足道的,你可以做一些有趣的事情,比如克隆整个游戏状态以在AI中运行不同的模拟。

总的来说,我很高兴Clojure作为模拟/游戏的语言。

根据这些经验,我认为可以改善Clojure游戏/模拟的事情将是:

  • 更好地支持基元,尤其是作为函数参数和返回值
  • 核心语言功能的实现对内存分配的影响较小(GC压力是交互式游戏的一个问题!)

您可以在此处查看游戏的早期版本:Ironclad - Generals of Steam。它基本上是一个蒸汽朋克主题策略游戏。

答案 3 :(得分:3)

模拟是一种解释器形式 - 易于以功能样式书写。它们也可以设计为self-optimizing simulators,基于将它们视为编译器。

答案 4 :(得分:3)

Bob叔叔最近一直在和Clojure一起玩,特别是写一个轨道模拟器作为他最公开的例子。

一些链接:

答案 5 :(得分:3)

补充其他答案:有一个称为功能反应式编程的学科,它解决了系统的功能表示问题,这些系统随时间变化并对外部事件作出反应。参见