Как функциональное программирование применимо к моделированию?

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

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

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

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

18
задан limist 28 August 2012 в 16:27
поделиться

5 ответов

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

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

3
ответ дан 30 November 2019 в 08:52
поделиться

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

Йорг В. Миттаг приводит ряд интересных примеров в этом ответе на вопрос о "реальном" программировании на Haskell (со ссылками на некоторые интересные статьи - ] Чисто функциональные Retrogames действительно стоит прочитать).

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

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

4
ответ дан 30 November 2019 в 08:52
поделиться

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

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

Далее идет простая игра «Змейка» , реализованная на Clojure. Достаточно легко читать через час или около того, и стиль действительно приятный и цельный.

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

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

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

Удачи!

5
ответ дан 30 November 2019 в 08:52
поделиться

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

2
ответ дан 30 November 2019 в 08:52
поделиться

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

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

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

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

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

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

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

4
ответ дан 30 November 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: