函数式编程如何应用于仿真?
除了标题中的一般问题之外,
我在问这个问题的同时学习了Clojure的创建者Rich Hickey如何特别设法驯服OO编程和可变状态的“偶然复杂性”,例如Clojure对身份和状态的分离很有意义(Hickey的ants.clj在研究中列表)。 另一个相关的领域是使用函数式编程来进行游戏,这些编程经常会在各处使用许多有状态的“事物”进行模拟; 有一些关于计划生育和游戏的文章/论文,更多的会受到欢迎。
也许经验丰富的功能程序员可以提供额外的背景和建议,以便如何将思维重新定位到功能风格,特别是模拟。 提前致谢!
Michal的回答非常好,但我想我会添加一些我个人发现的有用/有趣的简洁例子。
第一个是Lau Jenson关于功能流体动力学的文章(和代码)。 尽管他在这里肯定走了可变的路线,但是这种风格相当实用。 我敢打赌,Clojure 1.3可以用合理的性能来完成(主要是!)。
接下来是在Clojure中实现的一个简单的Snake游戏。 虽然在一个小时左右即可阅读,但风格却非常令人愉快和紧密。
另外,一些看起来很整洁的代码(我认为!)是代码建模神经网络。 Jeff Foster有一些单层感知器代码,还有一些更习惯性的代码版本。 值得一看的是,即使你不了解神经网络。 他还有一些关于流体动力学的新近职位,尽管这次是在Haskell。 (第一部分和第二部分)我认为,也有趣的是他执行人生游戏(&第二部分)。
最后,正如Michal在我之前提到的,Brian Carper正在Clojure开展一个角色扮演游戏。 他最近为游戏发布了一些艺术作品,所以我打赌它仍在继续;)
我喜欢使用序列库处理大量数据; 使用抽象如map
和reduce
,以及像juxt
这样有趣的,方便的工具而不是简单的命令式迭代更自然。 我已经发现,通过使用Clojure /功能性语言来重新实现众所周知的,执行良好的命令式算法,您的确可以缴纳税款。
玩的开心!
我不确定自己是否能够对这个问题提出的问题进行全面分析,但我至少可以发表一些关于FP与游戏前沿有趣的链接:
JörgW. Mittag在回答“真实世界”Haskell编程问题时提供了一些有趣的例子(链接到一些有趣的文章 - Purely Functional Retrogames系列真的值得一读)。
在Clojure的土地上,Phil Hagelberg为他的PeepCode Clojure编程实施了一个基于文本的冒险游戏; 代码在GitHub上可用。 然后是Brian Carper的RPG项目; 没有公开发布的代码,只是刚刚发布的一篇文章(虽然看起来非常酷,但让我们一起来压迫Brian继续;-))。 最后,这里有一个使用Penumbra的简单游戏的例子(出于某种原因 - 可能与Clojure无关 - 我无法使用它,但是你可能会加上附加的文字)。
至于模拟,学习ants.clj
是一个好主意。 另外,我还记得在加州大学伯克利分校的一门介绍性编程课程(我认为...?)上看到了一系列基于SICP的讲座,其中90%是在他们的YouTube频道上发布的。 他们已经在计划中举办了三次关于面向对象的讲座,我认为他们提到模拟是一个为该方法提供良好用例的领域。 请注意,我对这个有一个非常模糊的记忆,所以我很难说对你有多有用。
我正在用Clojure编写游戏,使用大多数功能风格。 例如,整个游戏状态被建模为不可变的数据结构。
这需要一些稍微复杂的编码。 例如,您经常最终创建具有大量参数的函数来传递游戏状态的各种元素,并确保游戏状态更新的应用发生在最新的游戏版本中。
但它也抛出了一些非常好的优点,例如并发性已经证明非常微不足道,您可以做一些有趣的事情,比如克隆整个游戏状态以在AI中运行不同的模拟。
总的来说,我很高兴将Clojure作为模拟/游戏的语言。
基于这种经验,我认为可以改善Clojure游戏/模拟的事情是:
你可以在这里看到游戏的早期版本:Ironclad - 蒸汽将军。 这基本上是一个蒸汽朋克主题策略游戏。
链接地址: http://www.djcxy.com/p/47717.html