用数字键入歧义

时间:2012-04-23 20:08:45

标签: haskell types

我在玩Haskell交互式提示符(ghci)时遇到了一些我很好奇的东西。以下代码在ghci 7.0.4下运行

[minBound..1]

抛出以下异常:

<interactive>:1:12:
    Ambiguous type variable `t0' in the constraints:
      (Num t0) arising from the literal `1' at <interactive>:1:12
      (Enum t0) arising from the arithmetic sequence `minBound .. 1'
                at <interactive>:1:1-13
      (Bounded t0) arising from a use of `minBound'
                   at <interactive>:1:2-9
    Probable fix: add a type signature that fixes these type variable(s)
    In the expression: 1
    In the expression: [minBound .. 1]
    In an equation for `it': it = [minBound .. 1]

我知道将上面的内容写成[minBound..1 :: Int]会清楚地表明'1'在这里是一个 Int ,但我的问题是,含糊不清的谎言? '1'可以解释为 Int 整数 Float Double ,但这些都不是 Int 属于 Bounded 类。那么文字1可以伪装成另一个类吗?如果没有,那么呢?

1 个答案:

答案 0 :(得分:10)

根据defaulting rules,如果

,则尝试通过默认来解析受约束的类型变量
  • 所有约束都具有C a形式; a不会作为约束中类型构造函数的参数出现,而
  • 至少有一个涉及的类是数字类,
  • 所有类都在Prelude或标准库中定义。

表达式[minBound .. 1]的推断类型是

[minBound .. 1] :: (Num a, Enum a, Bounded a) => [a]

所以默认规则适用。但是对于默认情况,只考虑模块的默认声明中列出的类型 - 如果没有默认声明,则假定(Integer, Double)默认默认 ,即要解析受约束的模糊类型变量,首先尝试Integer,如果不满足所有约束,则尝试Double。如果它不能满足所有约束条件,则默认失败并且编译失败并出现ambiguous type variable错误¹。

在目前的情况下,IntegerDouble都不满足Bounded约束,因此默认失败。

¹在ghci中,或者启用了ExtendedDefaultRules扩展名的情况下,如果约束中没有数字类但Show是,则也会尝试默认,默认默认值由()扩展