IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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!