Per testare le mie capacità in Haskell, ho deciso di realizzare il primo gioco che trovate in Land of Lisp/Realm of Racket. Il gioco "Indovina il mio numero". Il gioco si basa sullo stato mutabile per l'esecuzione, in quanto deve costantemente aggiornare i limiti superiore e inferiore per il programma in base al valore che l'utente sta pensando.Guess My Number, un mal di testa monadica
Va un po 'di qualcosa di simile:
> (guess)
50
> (smaller)
25
> (bigger)
37
Ora, questo genere di cose (a mia conoscenza) non è del tutto possibile in Haskell, chiamando qualche funzione dal REPL che modifica stato mutevole globale, quindi stampa immediatamente il risultato, in quanto viola il principio di immutabilità. Pertanto tutte le interazioni devono vivere all'interno di una monade IO
e/o State
. Ed è lì che sono bloccato.
Non riesco a spiegarmi come combinare la monade IO
e la monade State
, così posso ottenere input, stampare risultati e modificare lo stato, il tutto nella stessa funzione.
Ecco quello che ho ottenuto finora:
type Bound = (Int, Int) -- left is the lower bound, right is the upper
initial :: Bound
initial = (1, 100)
guess :: Bound -> Int
guess (l, u) = (l + u) `div` 2
smaller :: State Bound()
smaller = do
[email protected](l, _) <- get
let newUpper = max l $ pred $ guess bd
put $ (l, newUpper)
bigger :: State Bound()
bigger = do
[email protected](_, u) <- get
let newLower = min u $ succ $ guess bd
put $ (newLower, u)
Tutto quello che devo fare ora, è quello di trovare un modo per
- stampa tentativo iniziale
- ricevere il comando di voler più piccolo/più grande numero
- modificare lo stato di conseguenza
- chiamare la funzione in modo ricorsivo in modo da indovinare di nuovo
Come si combinano IO
e State
in modo elegante per raggiungere questo obiettivo?
Nota: sono consapevole che questo può probabilmente essere ottenuto senza l'uso dello stato; ma voglio renderlo fedele all'originale
Aspetta, quindi è il computer che indovina il numero? – Shoe
@Jefffrey sì, nella versione Lisp, il computer indovina, non la persona; ecco perché è molto più divertente implementare –
Vedi anche [Gestione dello stato] (http://stackoverflow.com/q/10048213/791604). –