针对明显相同的问题的不同错误报告

时间:2013-01-30 06:34:10

标签: haskell

使用Haskell的类型类我创建了一个列表类型类的实例,其元素不是该类型类的实例:

class Three a where
    three :: a -> [a]

instance (Three a) => Three [a] where
    three x = [x, x, x]

我得到一个不同的错误消息,列出整数列表和一个Chars列表:

字符数

*Main> three ['c']

<interactive>:11:1:
    No instance for (Three Char)
      arising from a use of `three'
    Possible fix: add an instance declaration for (Three Char)
    In the expression: three ['c']
    In an equation for `it': it = three ['c']

整数

*主&GT;三[1,2]

<interactive>:12:8:
    Ambiguous type variable `t0' in the constraints:
      (Num t0) arising from the literal `1' at <interactive>:12:8
      (Three t0) arising from a use of `three' at <interactive>:12:1-5
    Probable fix: add a type signature that fixes these type variable(s)
    In the expression: 1
    In the first argument of `three', namely `[1, 2]'
    In the expression: three [1, 2]

为什么?

(现在,Chars的错误被理解了 - 没有它的实例。但是整数的模糊性错误对我来说并不清楚。我认为这可能不是因为整数已经是某个实例(Num)所以我为Char创建了另一个任意类型类和一个实例,但是像以前一样得到了与Char相同的错误。)

我将非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

第一个错误指出Three的{​​{1}}没有实例。如你所说,轻松!

然而,在第二种情况下,由于您的数字文字的类型是未知/多态的,GHC无法判断是否为它们的实例。因此,错误不是关于缺失的实例,而是一个模糊的变量。

例如,您可以为CharThree提供Int的有效实例。 GHC如何知道选哪个?

(忽略延长的违约,即)。

因此错误是不同的,因为实际的错误类型不同。