2017-09-02 54 views
0

我正在嘗試編寫一個程序,循環等待用戶輸入的所有時間,但由於某種原因它不會循環。 我的計劃是:***異常:haskell中的用戶錯誤(Prelude.readIO:無解析)

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時,它將只從您的流中獲取單個字符。但是,如果您已輸入A輸入,換行符'\n'仍在您的stdin中。 A '\n'無法解析爲Int,因此最終出現該錯誤。

 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 

如果你打電話getLine之後您可以刪除換行符