Как функциональное программирование применяется к симуляциям?
Помимо общего вопроса в заголовке,
- Как функциональные программисты и функциональные языки подходят к области моделирования, которые, по-видимому, наиболее естественно обрабатываются объектно-ориентированными языками?
- Есть ли примеры с открытым исходным кодом сложных симуляций, написанных в (главным образом) функциональном стиле?
- Какими изменениями перспективы понадобится программист 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
В дополнение к другим ответам: существует дисциплина Функциональное реактивное программирование, которая затрагивает проблему функционального представления систем, которые меняются во времени и реагируют на внешние события. См