2017-09-02 27 views
0

私は、ユーザーからの入力を待つすべての時間をループするプログラムを作成しようとしていますが、何らかの理由でループしません。***例外:ユーザーのエラー(Prelude.readIO:no parse)in haskell

charAt :: String->Char->Int 
main = do 
    x <- readLn 
    if x == 1 
     then do 
      putStrLn "Word: " 
      word <- getLine 
      putStrLn "Char: " 
      ch <- getChar 
      putStrLn (show (charAt word ch)) 
     else print "Nothing" 
    main 

しかし、私は実際にはこのエラーを取得: 私のプログラムがあり、私は最後のメイン呼び出すプログラムが動作します削除した場合

*** Exception: user error (Prelude.readIO: no parse)

を。 誰かがなぜそれが起こっているのか知っていますか?

答えて

2

getCharを使用すると、ストリームから1文字しか取り込まれません。ただし、Aと入力した場合は、と入力してください。改行文字'\n'はまだstdinにあります。 '\n'は、Intに解析できないため、そのエラーが発生します。

あなたはその後getLineを呼び出す場合は、その改行を削除することができます

 ch <- getChar 
     putStrLn (show (charAt word ch)) 
     _ <- getLine 

それとも、独自のヘルパーを書く:

promptInt :: IO Int 
promptInt = do 
    putStr "Int: " 
    line <- getLine 
    case readMaybe line of 
    Just x -> return x 
    _  -> putStrLn "Try again." >> promptInt 

promptChar :: IO Char 
promptChar = do 
    putStr "Char: " 
    line <- getLine 
    case line of 
    [x,_] -> return x 
    _  -> putStrLn "Try again." >> promptChar