【问题标题】:*** Exception: user error (Prelude.readIO: no parse) in haskell*** 例外:haskell 中的用户错误(Prelude.readIO:无解析)
【发布时间】:2018-02-11 08:47:22
【问题描述】:

我正在尝试编写一个一直循环等待用户输入但由于某种原因它没有循环的程序。 我的程序是:

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

但我实际上得到了这个错误:

*** 异常:用户错误(Prelude.readIO:无解析)

如果我删除最后一个主调用程序将工作。 有人知道为什么会这样吗?

【问题讨论】:

    标签: haskell exception io


    【解决方案1】:

    当您使用getChar 时,它只会从您的流中提取一个字符。但是,如果您输入了 AEnter,则换行符 '\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
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 2012-01-23
      • 2018-12-11
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多