Czy istnieje wspólna technika obsługi stanu (ogólnie) w funkcjonalnym języku programowania? W każdym (funkcjonalnym) języku programowania istnieją rozwiązania do obsługi stanu globalnego, ale chcę tego uniknąć w miarę możliwości.
Wszystkie stany w czysto funkcjonalny sposób są parametrami funkcji. Muszę więc ustawić cały stan gry (gigantyczna mapa świata, graczy, pozycje, wyniki, zasoby, wrogów, ...) jako parametr wszystkich funkcji, które chcą manipulować światem na danym wejściu lub wyzwalaczu . Sama funkcja pobiera odpowiednie informacje z obiektu blob gamestate, zrób coś z tym, manipuluj gamestate i zwróć gamestate. Ale wygląda to na kiepskie rozwiązanie problemu. Gdybym włożył cały gamestate do wszystkich funkcji, nie ma dla mnie korzyści w przeciwieństwie do zmiennych globalnych lub imperatywnego podejścia.
Mógłbym wstawić tylko odpowiednie informacje do funkcji i zwrócić działania, które zostaną podjęte dla danych wejściowych. Jedna funkcja stosuje wszystkie działania do gamestate. Ale większość funkcji wymaga wielu „istotnych” informacji. move()
potrzebuję pozycji obiektu, prędkości, mapy kolizji, pozycji wszystkich wrogów, obecnego stanu zdrowia ... Więc to podejście też nie działa.
Więc moje pytanie brzmi: jak poradzić sobie z ogromną ilością stanów w funkcjonalnym języku programowania - szczególnie w przypadku tworzenia gier?
EDYCJA: W Clojure istnieje kilka platform do budowania gier. Podejście polegające na częściowym rozwiązaniu tego problemu polega na tym, że wszystkie przedmioty w grze są tak zwane „byty” i wkładane do ogromnej torby. Gigant główną funkcją trzyma ekran i podmioty i wydarzenia uchwyt ( :on-key-down
, :on-init
...) dla tej jednostki i uruchomić główną pętlę wyświetlacza. Ale nie jest to czyste rozwiązanie, którego szukam.
move()
prawdopodobnie powinieneś przechodzić przez „bieżący” obiekt (lub jego identyfikator), plus świat, przez który się porusza, i po prostu wyliczyć aktualną pozycję i prędkość ... wyjście jest wtedy całym światem fizyki, a przynajmniej lista zmienionych obiektów.