Questa è principalmente una domanda teorica su FP, ma prenderò avventure testuali (come la vecchia scuola Zork) per illustrare il mio punto. Mi piacerebbe conoscere le tue opinioni su come modellare una simulazione stateful con FP.
Le avventure testuali sembrano davvero richiedere OOP. Ad esempio, tutte le "stanze" sono istanze di una Roomclasse, puoi avere una Itemclasse di base e interfacce come Item<Pickable>per cose che puoi portare e così via.
La modellizzazione del mondo in FP funziona in modo diverso, soprattutto se si desidera imporre l'immutabilità in un mondo che deve mutare man mano che il gioco procede (gli oggetti vengono spostati, i nemici vengono sconfitti, il punteggio aumenta, il giocatore cambia la sua posizione). Immagino un unico grande oggetto Worldche ha tutto: quali sono le stanze che puoi esplorare, come sono collegate, cosa sta portando il giocatore, quali leve sono state attivate.
Penso che un approccio puro sarebbe fondamentalmente passare questo grande oggetto a qualsiasi funzione e farlo restituire da loro (possibilmente modificato). Ad esempio, ho una moveToRoomfunzione che la ottiene Worlde la restituisce World.player.locationcambiata nella nuova stanza World.rooms[new_room].visited = Truee così via.
Anche se questo è il modo più "corretto", sembra imporre la purezza per il gusto di farlo. A seconda del linguaggio di programmazione, passare Worldavanti e indietro questo oggetto potenzialmente molto grande può essere costoso. Inoltre, potrebbe essere necessario che ogni funzione abbia accesso a qualsiasi Worldoggetto. Ad esempio, una stanza può essere accessibile o meno a seconda di una leva attivata in un'altra stanza perché potrebbe essere allagata, ma se il giocatore porta un giubbotto di salvataggio, può comunque entrarvi. Un mostro può essere aggressivo o meno a seconda che il giocatore abbia ucciso suo cugino in un'altra stanza. Ciò significa che la roomCanBeEnteredfunzione deve accedere World.player.invetorye World.rooms, describeMonsterdeve accedere World.monsterse così via (in pratica, è necessariopassare l'intero carico in giro). Questo mi sembra davvero richiedere una variabile globale, anche se questo è quasi un buon stile di programmazione soprattutto in FP.
Come risolveresti questo problema?