Jest to głównie teoretyczne pytanie o FP, ale wezmę udział w tekstowych przygodach (takich jak oldschoolowy Zork), aby zilustrować mój punkt widzenia. Chciałbym poznać twoje opinie na temat tego, jak modelowałbyś stanową symulację z FP.
Wydaje się, że przygody tekstowe wymagają OOP. Na przykład wszystkie „pokoje” są instancjami Roomklasy, możesz mieć Itemklasę podstawową i interfejsy, takie jak Item<Pickable>rzeczy, które możesz nosić i tak dalej.
Modelowanie świata w FP działa inaczej, szczególnie jeśli chcesz wymusić niezmienność w świecie, który musi mutować w miarę postępów w grze (obiekty są przemieszczane, wrogowie są pokonani, liczba punktów rośnie, gracz zmienia lokalizację). Wyobrażam sobie jeden duży obiekt, Worldktóry ma to wszystko: jakie pokoje możesz eksplorować, w jaki sposób są połączone, co niesie gracz, jakie dźwignie zostały uruchomione.
Myślę, że czystym podejściem byłoby po prostu przekazanie tego dużego obiektu do dowolnej funkcji i zwrócenie go (ewentualnie zmodyfikowanego). Na przykład mam moveToRoomfunkcję, która pobiera Worldi zwraca ją wraz ze World.player.locationzmianą w nowym pokoju World.rooms[new_room].visited = Truei tak dalej.
Nawet jeśli jest to bardziej „poprawny” sposób, wydaje się, że egzekwuje czystość ze względu na to. W zależności od języka programowania przekazywanie tego potencjalnie bardzo dużego Worldobiektu tam iz powrotem może być kosztowne. Ponadto każda funkcja może wymagać dostępu do dowolnego Worldobiektu. Na przykład, pokój może być dostępny lub nie w zależności od dźwigni uruchomionej w innym pokoju, ponieważ może być zalany, ale jeśli gracz nosi kamizelkę ratunkową, może i tak wejść do niej. Potwór może być agresywny lub nie, w zależności od tego, czy gracz zabił swojego kuzyna w innym pokoju. Oznacza to, że roomCanBeEnteredfunkcja musi mieć dostęp World.player.invetoryi World.rooms, describeMonstermusi mieć dostęp World.monstersi tak dalej (w zasadzie, to musiprzekazać cały ładunek). Wydaje mi się, że to naprawdę wymaga globalnej zmiennej, nawet jeśli jest to dobry styl programowania, szczególnie w FP.
Jak rozwiązałbyś ten problem?