Це здебільшого теоретичне питання про ПП, але я буду брати текстові пригоди (на зразок старого шкільного Зорка), щоб проілюструвати свою думку. Мені хотілося б дізнатися ваші думки щодо того, як би ви змогли змоделювати модерацію з FP.
Текстові пригоди справді, схоже, закликають OOP. Наприклад, всі "номери" - це екземпляри 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.
Як би ви вирішили цю проблему?