为什么在类型变量不明确时推断Integer?

时间:2015-11-03 03:57:20

标签: haskell type-inference

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

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

由于含糊不清,我希望编译失败:+n1n2的类型限制为Num类型类而不是特定类型。但是,GHC 7.10成功编译它推断Integer类型(将+替换为/会将推断类型更改为Double)。对此有何解释?

1 个答案:

答案 0 :(得分:4)

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

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

default (Int, Rational)

如果您想为模块关闭默认值,请不要给它任何类型:

default ()

老实说,这是一个让Haskell更容易用作计算器的大黑客。但它确实让生活变得更加容易,因为我们不必在像你这样的程序中明确地注释文字的类型,这也会让人感到困惑。