当类型变量应该不明确时,为什么会推断出 Integer?

Why is Integer inferred when the type variable should be ambiguous?

这个小 Haskell 程序从控制台读取两个 space 分隔的数字并打印它们的总和:

main = do
  line <- getLine
  let n1:n2:_ = map read $ words line
  print $ n1 + n2

我预计编译会因歧义而失败:+n1n2 的类型限制为 Num 类型类而不是特定类型.然而 GHC 7.10 成功编译它推断 Integer 类型(将 + 替换为 / 将推断类型更改为 Double)。对此有何解释?

Haskell 有一个处理数字 类(NumFractional 和其他一些)的特殊情况,它为不明确的类型变量选择默认类型. (有关详细信息,请参阅 2010 report。)

它的工作方式是尝试一系列数字类型,直到一个满足所有约束。默认情况下,它首先尝试 Integer,然后 Double,但您也可以在每个模块的基础上进行控制:

default (Int, Rational)

如果你想为你的模块关闭默认设置,不要给它任何类型:

default ()

老实说,这是一个让 Haskell 更容易用作计算器的大 hack。但它确实让生活变得更轻松,因为我们不必在像您这样的程序中显式注释文字类型,这也会造成混淆。