Haskellでの数当てゲームでのIO遅延
(05/08追記)コメントを参照してください。
数当てゲームを作ってみました。 doブロック中で出力と入力が交互に処理されるロジックを書いたつもりですが、そうはなりませんでした。遅延評価によると思うのですが、解決方法がわかりませんでした。根本的なところが理解できていないです。。
1 import System.IO 2 import System.Random 3 4 main :: IO () 5 main = guessNumber 6 7 guessNumber:: IO () 8 guessNumber = 9 do num <- getNum 10 -- putStrLn $ show num 11 putStrLn "Try to guess the number (1--100):" 12 guess num 13 14 guess :: Int -> IO () 15 guess num = 16 do putStr "> " 17 x <- readLn :: IO Int 18 if x == num then 19 putStrLn "You got it!" 20 else 21 do putStrLn $ "guess a " ++ (if (x>num) then "smaller" else "larger") ++ " number." 22 guess num 23 24 getNum :: IO Int 25 getNum = getStdRandom (randomR (1,100))
実行結果
[work06]$ runghc test03.hs Try to guess the number (1--100): 30 > guess a smaller number. 5 > guess a larger number. 26 > guess a larger number. 28 > guess a smaller number. 29 > guess a smaller number. 27 > You got it! [work06]$
期待する結果
Try to guess the number (1--100): > 30 guess a smaller number. > 5 guess a larger number. > 26 guess a larger number. > 28 guess a smaller number. > 29 guess a smaller number. > 27 You got it!