Esiste una tecnica comune per gestire lo stato (in generale) in un linguaggio di programmazione funzionale? Esistono soluzioni in ogni linguaggio di programmazione (funzionale) per gestire lo stato globale, ma voglio evitarlo il più possibile.
Tutti gli stati in un puro modo funzionale sono parametri di funzione. Quindi ho bisogno di mettere l'intero stato del gioco (una gigantesca hashmap con il mondo, i giocatori, le posizioni, il punteggio, le risorse, i nemici, ...)) come parametro per tutte le funzioni che vogliono manipolare il mondo su un dato input o trigger . La stessa funzione raccoglie le informazioni rilevanti dal BLOB del gamestato, fa qualcosa con esso, manipola il gamestato e restituisce il gamestato. Ma questa sembra una soluzione povera per il problema. Se metto l'intero gamestate in tutte le funzioni, non c'è alcun vantaggio per me in contrasto con le variabili globali o l'approccio imperativo.
Potrei inserire solo le informazioni rilevanti nelle funzioni e restituire le azioni che verranno intraprese per l'input dato. E una singola funzione applica tutte le azioni al gamestate. Ma la maggior parte delle funzioni necessita di molte informazioni "rilevanti". move()
serve la posizione dell'oggetto, la velocità, la mappa per la collisione, la posizione di tutti i clisteri, la salute attuale, ... Quindi neanche questo approccio sembra funzionare.
Quindi la mia domanda è: come posso gestire l'enorme quantità di stato in un linguaggio di programmazione funzionale, specialmente per lo sviluppo di giochi?
EDIT: ci sono alcuni framework di gioco per la costruzione di giochi in Clojure. L'approccio per risolvere parzialmente questo problema è quello di infilare tutti gli oggetti nel gioco come "entità" e metterlo in una borsa enorme. Una funzione principale gigant sta tenendo lo schermo e le entità e gli eventi maniglia ( :on-key-down
, :on-init
, ...) per questo gli enti ed eseguire il ciclo display principale. Ma questa non è la soluzione pulita che sto cercando.
move()
, probabilmente dovresti passare nell'oggetto "corrente" (o un identificatore per esso), oltre al mondo attraverso il quale si sta muovendo, e derivare semplicemente la posizione e la velocità attuali ... l'output è allora l'intero mondo della fisica, o almeno un elenco di oggetti modificati.