用数字键入歧义

Aky*_*Aky 5 haskell types

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

[minBound..1]
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

<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]
Run Code Online (Sandbox Code Playgroud)

我知道将上面的内容写成[minBound..1 :: Int]会清楚地表明'1'在这里是一个Int,但我的问题是,歧义在哪里?'1'可以解释为Int,Integer,FloatDouble,但除Int之外,这些都不属于Bounded类.那么文字1可以伪装成另一个类吗?如果没有,那又怎样?

Dan*_*her 10

根据默认规则,尝试通过默认来解决约束类型变量if

  • 所有约束都有形式C a; a不会出现作为约束中类型构造函数的参数,并且
  • 至少有一个涉及的类是数字类,和
  • 所有类都在Prelude或标准库中定义.

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

[minBound .. 1] :: (Num a, Enum a, Bounded a) => [a]
Run Code Online (Sandbox Code Playgroud)

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

在手头的情况下,既不满足Integer也不Double满足Bounded约束,因此违约失败.

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