这个微小的Haskell程序从控制台读取两个以空格分隔的数字并打印它们的总和:
main = do
line <- getLine
let n1:n2:_ = map read $ words line
print $ n1 + n2
由于含糊不清,我希望编译失败:+
将n1
和n2
的类型限制为Num
类型类而不是特定类型。但是,GHC 7.10成功编译它推断Integer
类型(将+
替换为/
会将推断类型更改为Double
)。对此有何解释?
答案 0 :(得分:4)
Haskell有一个处理数值类(Num
,Fractional
和其他几个)的特殊情况,它为模糊类型变量选择默认类型。 (有关详细信息,请参阅2010 report。)
它的工作方式是尝试一系列数字类型,直到满足所有约束。默认情况下,它首先尝试Integer
然后Double
,但您也可以按模块进行控制:
default (Int, Rational)
如果您想为模块关闭默认值,请不要给它任何类型:
default ()
老实说,这是一个让Haskell更容易用作计算器的大黑客。但它确实让生活变得更加容易,因为我们不必在像你这样的程序中明确地注释文字的类型,这也会让人感到困惑。