Как функциональное программирование применяется к симуляции? - PullRequest
18 голосов
/ 07 августа 2010

Помимо общего вопроса в заголовке,

  • Как функциональные программисты и функциональные языки подходят к области симуляции, которая наиболее естественно обрабатывается объектно-ориентированными языками?
  • Существуют ли примеры открытого моделирования сложных симуляций, написанных в (в основном) функциональном стиле?
  • Какие изменения перспективы потребуются OO-программисту, чтобы приблизиться к симуляции из функциональной парадигмы?

Я спрашиваю об этом, узнавая, как создатель Clojure Рич Хики специально стремился укротить «случайную сложность» OO-программирования и изменчивого состояния, например Разделение идентичности и состояния в Clojure имеет большой смысл (файл Hickey's ants.clj находится в списке исследований). Еще одна связанная с этим область - использование функционального программирования для игр, которые часто представляют собой симуляции с множеством «вещей» с состоянием повсюду; Есть несколько статей / статей, написанных о ФП и играх, другие будут приветствоваться.

Возможно, опытные функциональные программисты могут предоставить дополнительную справочную информацию и советы о том, как переориентировать свое мышление на функциональный стиль, особенно для моделирования. Заранее спасибо!

Ответы [ 6 ]

5 голосов
/ 08 августа 2010

Ответ Михала превосходен, но я подумал, что добавлю еще пару интересных примеров, которые я лично нашел полезными / интересными.

Первый - пост (и код) о функциональной гидродинамике Лау Дженсона.Хотя он определенно идет по этому пути с изменчивой скоростью, стиль довольно функциональный.Бьюсь об заклад, с помощью Clojure 1.3 это можно сделать (в основном!) Неизменно с разумной производительностью.

Следующей является простая игра Snake , реализованная в Clojure.Достаточно легко читать, хотя через час или около того, и стиль действительно приятный и сплоченный.

Кроме того, некоторый аккуратный код, на который следует обратить внимание (я думаю!), - это моделирование кода нейронных сетей.У Джеффа Фостера есть однослойный код персептрона и еще несколько идиоматических версий кода .Стоит посмотреть, даже если вы не знакомы с NNs.У него также есть несколько недавних постов, касающихся динамики жидкости, хотя на этот раз в Хаскелле.( Часть I и Часть II ) Думаю, также забавно, что его реализация Game of Life (& Часть II ).

Наконец, как упоминал до меня Михал, Брайан Карпер работает над RPG в Clojure .он недавно опубликовал несколько иллюстраций для игры, так что держу пари, что над этим все еще ведется работа;)

Мне нравится использовать библиотеки последовательностей для работы с множеством данных;он кажется более естественным с использованием абстракций, таких как map и reduce, и забавных, удобных инструментов, таких как juxt, а не простых императивных итераций.Я обнаружил, что вы платите налог, используя Clojure / функциональные языки для переопределения известных и хорошо реализованных императивных алгоритмов.

Веселись!

4 голосов
/ 09 августа 2010

Я пишу игру на Clojure, используя в основном функциональный стиль. Например, все игровое состояние моделируется как неизменяемая структура данных.

Для этого потребовалось немного запутанное кодирование. Например, вы часто заканчиваете тем, что создаете функции с большим количеством параметров для передачи различных элементов состояния игры и гарантируете, что применение обновлений состояния игры происходит с самой последней версией игры.

Но это также дало некоторые действительно хорошие преимущества, например, параллелизм оказался довольно тривиальным, и вы можете делать забавные вещи, такие как клонирование всего состояния игры, для запуска различных симуляций в AI.

В целом, я в восторге от Clojure как языка для симуляций / игр.

Исходя из этого опыта, я думаю, что улучшит Clojure для игр / симуляций:

  • Лучшая поддержка примитивов, особенно в качестве параметров функции и возвращаемых значений
  • Реализация базовых функций языка, которые менее сложны при распределении памяти (GC - проблема для интерактивных игр!)

Раннюю версию игры вы можете увидеть здесь: Ironclad - Generals of Steam . Это в основном тематическая игра в стиле стимпанк.

4 голосов
/ 07 августа 2010

Я не уверен, что справляюсь с задачей составить исчерпывающий анализ проблемы, поставленной в вопросе, но я могу, по крайней мере, опубликовать некоторые интересные ссылки на ФП против игр:

Jörg W. Mittag приводит ряд интересных примеров в этом ответе на вопрос о программировании на Haskell в «реальном мире» (со ссылками на некоторые интересные рецензии - Purely Functional Retrogames* Серию действительно стоит прочитать).

В земле Clojure Фил Хейгельберг реализовал текстовую приключенческую игру для своего PeepCode скриншота по программированию на Clojure;код доступен на GitHub .Тогда есть проект Брайана Карпера RPG ;пока еще не опубликовано ни одного кода, и только этот пост некоторое время назад (хотя это выглядело очень круто, поэтому давайте все соберемся, чтобы заставить Брайана продолжать ;-)).Наконец, здесь - пример простой игры, использующей Penumbra (по какой-то причине - возможно, не связанной с Clojure - я не смог заставить ее работать, но, возможно, вы это сделаете, плюс есть запись -прикреплен).

Что касается моделирования, изучение ants.clj - отличная идея.Кроме того, я помню серию лекций на основе SICP из вводного курса по программированию в Калифорнийском университете в Беркли (я думаю ...?), Доступного где-то (90% это было на их канале YouTube);у них есть три лекции по ООП в Схеме, и я думаю, они упоминают симуляцию как область, обеспечивающую хорошие варианты использования для этого подхода.Обратите внимание, что у меня довольно смутное воспоминание об этом, поэтому мне трудно сказать, насколько это может быть полезно для вас.

3 голосов
/ 29 августа 2012

В дополнение к другим ответам: существует дисциплина под названием Функциональное реактивное программирование , которая решает проблему функционального представления систем, которые изменяются во времени и реагируют на внешние события. См

3 голосов
/ 08 августа 2010

Дядя Боб в последнее время играл с Clojure и, в частности, писал орбитальный симулятор, как его самый публичный пример.

Некоторые ссылки:

2 голосов
/ 08 августа 2010

Симуляции - это форма интерпретатора, которую легко написать в функциональном стиле.Они также могут быть сконструированы как самооптимизирующиеся симуляторы , основанные на трактовке их как компилятора.

...