【问题标题】:Why is Integer inferred when the type variable should be ambiguous? [duplicate]为什么在类型变量应该不明确时推断 Integer? [复制]
【发布时间】:2016-02-03 03:13:21
【问题描述】:

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

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

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

【问题讨论】:

  • 我知道链接问题中的答案提到了默认,但仍将问题标记为“什么是单态限制?”的重复项。具有误导性,因为单态限制与此处无关。

标签: haskell type-inference


【解决方案1】:

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

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

default (Int, Rational)

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

default ()

老实说,这是让 Haskell 更容易用作计算器的一个大技巧。但它确实让生活变得轻松了一些,因为我们不必在像你这样的程序中显式地注释文字的类型,这也会让人困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2021-06-12
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多