运行以下代码时,我没有遇到运行时错误:
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之间的区别是什么?
答案 0 :(得分:6)
查看类型。
readLn :: Read a => IO a
和
getLine :: IO String
readLn
根据结果类型的“读取”格式解析输入。格式与show
相同。
所以你试图以read
格式从输入中show
一个Haskell字符串值,这是令人困惑的,除非该字符串已经是双qyoted haskell格式。