getLine和readLn之间的区别

时间:2014-12-24 10:56:44

标签: haskell io

运行以下代码时,我没有遇到运行时错误:

printReverse :: IO ()
printReverse = do
    line <- getLine
    when (not $ null line) $
            do putStrLn $ reverse line
               printReverse
    return ()

但是当我运行相同的代码时,我将getLine替换为readLn :: IO String,我得到一个解析错误。

代码:

printReverse :: IO ()
printReverse = do
    line <- readLn :: IO String
    when (not $ null line) $
            do putStrLn $ reverse line
               printReverse
    return ()

错误:

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

getLine和readLn之间的区别是什么?

1 个答案:

答案 0 :(得分:6)

查看类型。

readLn :: Read a => IO a

getLine :: IO String

readLn根据结果类型的“读取”格式解析输入。格式与show相同。

所以你试图以read格式从输入中show一个Haskell字符串值,这是令人困惑的,除非该字符串已经是双qyoted haskell格式。