为什么欠约束类型有时会给出运行时错误?

时间:2012-12-15 21:27:41

标签: haskell

请考虑以下事项:

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调查时,我因同一个原因收到同样的例外。

1 个答案:

答案 0 :(得分:3)

这是因为GHCi的extended default rules。如果将相同的代码放在没有签名的文件中,您应该会看到预期的错误。

(在这种情况下,它可能会选择()作为类型,这就是你得到解析错误的原因。)