Ich habe ein kleines interaktives Spieleprogramm. Der interaktive Teil sieht so aus:IO in Haskell nicht sichtbar
main :: IO()
main = playGame newGame
where
playGame :: Game -> IO()
playGame game =
do putStr $ show game
putStr $ if gameOver game then "Another game? (y or n) > "
else show (whoseMove game) ++ " to play (row col) > "
moveWords <- fmap (words . fmap cleanChar) getLine
if stopGame game moveWords
then return()
else playGame $ if gameOver game then newGame else makeMove game moveWords
Das funktioniert gut. Es zeigt den Spielzustand, fragt nach dem nächsten Schritt gilt diese Bewegung in den Zustand, zeigt den neuen Zustand usw.
Dann sah ich ein video von Moss Collum in dem er ein game zeigte, dass die folgende Strategie verwendet für die Interaktion mit dem Benutzer.
...
userInput <- getContents
foldM_ updateScreen (12, 40) (parseInput userInput) where
...
Ich konnte kein Hinweis auf foldM_
finden aber es war eine Art von fold
ich versuchte, unter der Annahme. (Ich habe versucht, tatsächlich eine Reihe von Dingen, aber dies scheint klarsten.)
main' :: IO()
main' = do
moveList <- fmap (map words . lines . map cleanChar) getContents
let states = scanl makeMove newGame moveList
foldl (\_ state -> putStr . show $ state) (return()) states
Wenn ich es laufen, habe ich nie das Spiel Zustand erhalten ausgedruckt, bis nach der Kollision mit End-of-Datei, an welchem Punkt die korrekte endgültige Der Spielstatus wird gedruckt. Davor kann ich Moves eingeben und sie werden richtig verarbeitet (entsprechend dem finalen Spielzustand), aber ich sehe nie die Zwischenzustände. (Die Idee ist, dass eine faule Auswertung die Spielstände drucken sollte, sobald sie verfügbar sind.)
Ich würde gerne verstehen, warum ich die Zwischenzustände nicht sehe und was ich tun kann, um es zu reparieren.
Nach der Eingabe des Dateiendes (^ Z unter Windows) verweigert das Programm die Wiedergabe und sagt, dass das Handle geschlossen wurde. Um wieder zu spielen, muss ich das Programm neu starten. Gibt es eine Möglichkeit, das zu beheben?
Sie falten keine Sequenzeffekte (grob, das M in 'foldM'). Wenn du 'foldl' verwenden willst, probiere zumindest etwas wie' \ act state -> act >> putStr .... 'so dass der vorherige' act' tatsächlich ausgeführt wird. Ich würde auch versuchen, 'mapM',' forM' oder ihre Anwendung Cousins zu verwenden. Z.B. Versuchen Sie 'for_ [1..10] print' nach dem Import' Data.Foldable' – chi
Überprüfen Sie die Haskell-Tag über Abschnitt für Informationen über hoogle und andere Goodies – jberryman
Danke. forM_ erledigt den Job. Gibt es eine Möglichkeit, nach der Eingabe des Dateiendes erneut zu öffnen? –
RussAbbott