请考虑以下事项:
do putStr ""
return $ map read ["2"]
在GHCI中运行,这给出了
[*** Exception: Prelude.read: no parse
我期待一个“ambigious type variable”编译错误,但是这会在运行时出现。为什么呢?
为了进行比较,以下三个示例确实给出了“模糊类型变量”错误:
map read ["2"]
do putStr ""
return $ read "2"
do [1]
return $ map read ["2"]
顺便说一句,这是我遇到此内容的原始代码。
readInts :: String -> IO [Integer]
readInts f = do s <- readFile f
return $ map read $ splitOneOf " \n" s
这已经解决了。我的原始代码试图从列表末尾的“”读取。当我在GHCI调查时,我因同一个原因收到同样的例外。
答案 0 :(得分:3)
这是因为GHCi的extended default rules。如果将相同的代码放在没有签名的文件中,您应该会看到预期的错误。
(在这种情况下,它可能会选择()
作为类型,这就是你得到解析错误的原因。)