Это в основном теоретический вопрос о FP, но я возьму текстовые приключения (например, Zork старой школы), чтобы проиллюстрировать мою точку зрения. Мне бы хотелось узнать ваше мнение о том, как бы вы смоделировали симуляцию с состоянием с помощью FP.
Текстовые приключения действительно требуют ООП. Например, все «комнаты» являются экземплярами Room
класса, у вас может быть базовый Item
класс и интерфейсы, например, Item<Pickable>
для вещей, которые вы можете нести, и так далее.
Моделирование мира в FP работает по-другому, особенно если вы хотите обеспечить неизменность в мире, который должен изменяться по ходу игры (объекты перемещаются, враги побеждены, выигрыш растет, игрок меняет свое местоположение). Я представляю один большой объект, в World
котором есть все: какие комнаты вы можете исследовать, как они связаны, что несет игрок, какие рычаги были задействованы.
Я думаю, что чистый подход заключается в том, чтобы передать этот большой объект любой функции и вернуть его (возможно, модифицировать). Например, у меня есть moveToRoom
функция, которая получает World
и возвращает ее с World.player.location
измененной в новую комнату World.rooms[new_room].visited = True
и так далее.
Даже если это более «правильный» путь, похоже, он принуждает нас к чистоте. В зависимости от языка программирования передача этого потенциально очень большого World
объекта назад и вперед может быть дорогой. Кроме того, каждая функция может иметь доступ к любому World
объекту. Например, комната может быть доступной или нет в зависимости от рычага, сработавшего в другой комнате, потому что она может быть затоплена, но если игрок носит спасательный жилет, он может войти в него в любом случае. Монстр может быть агрессивным или нет в зависимости от того, убил ли игрок своего двоюродного брата в другой комнате. Это означает , что roomCanBeEntered
функция требует доступа World.player.invetory
и World.rooms
, describeMonster
необходимо получить доступ World.monsters
и так далее ( в основном, вы должныпередать всю нагрузку вокруг). Мне действительно кажется, что это требует глобальной переменной, даже если это почти хороший стиль программирования, особенно в FP.
Как бы вы решили эту проблему?