Это в основном теоретический вопрос о 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.
Как бы вы решили эту проблему?