Как функциональное программирование применяется к симуляциям?

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

Удачи!

Ответ 2

Я не уверен, что у меня есть проблема с написанием всестороннего анализа проблемы, поставленной в вопросе, но я могу по крайней мере опубликовать некоторые интересные ссылки на FP против игрового фронта:

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

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

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

Ответ 3

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

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

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

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

Основываясь на этом опыте, вещи, которые, я думаю, улучшат Clojure для игр/симуляций:

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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