我有一個小小的互動遊戲程序。交互式部分看起來是這樣的,Haskell中的IO不可見
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
這工作得很好。它顯示遊戲狀態,詢問下一步的行動,應用於移動的狀態,顯示新的狀態等
然後,我通過Moss Collum中,他表明,使用以下策略交互的game看到了video與用戶。
...
userInput <- getContents
foldM_ updateScreen (12, 40) (parseInput userInput) where
...
我無法找到foldM_
參考,但假設它是某種fold
我嘗試這樣做。 (其實,我嘗試了一些東西,但是這似乎是清楚的。)
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
當我運行它,我從來沒有打印出來的比賽狀態,直到擊中檔案結尾之後,此時正確的最終遊戲狀態被打印。在此之前,我可以輸入動作,並且它們被正確處理(根據最終遊戲狀態),但我從來沒有看到中間狀態。 (這個想法是,懶惰的評估應該打印遊戲狀態,因爲它們變得可用。)
我很感激幫助理解爲什麼我沒有看到中間狀態,以及我能做些什麼來修復它。
此外,在輸入文件結尾(Windows上的^ Z)後,程序拒絕再次播放,表示句柄已關閉。要再次播放,我必須重新啓動程序。有沒有辦法解決這個問題?
你摺疊不會產生序列效果(粗略地說,'foldM'中的M)。如果你想使用'foldl',至少應該使用'\ act state - > act >> putStr ....'以便前面的'act'確實運行。我也會嘗試使用'mapM','forM'或他們的應用表親。例如。在導入'Data.Foldable'後試試'for_ [1..10] print' – chi
查看有關hoogle和其他好東西的信息部分的haskell標籤 – jberryman
謝謝。 forM_完成這項工作。現在有沒有辦法在輸入文件結束後重新打開? –
RussAbbott