0

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

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

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

对于整数列表和字符列表,我收到不同的错误消息:

字符

*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']

整数

*主要>三个[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 的错误已被理解 - 没有实例。但 Integers 的歧义错误对我来说并不清楚。我认为这可能不是因为整数已经是某物(Num)的实例,所以我创建了另一个任意类型类和它的一个实例用于 Char,但对于 Char 得到与以前相同的错误)。

我会感谢你的帮助

4

1 回答 1

0

第一个错误指出没有 forThree的实例Char。正如你所说,简单!

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

例如,您可以Three同时拥有Int和的有效实例Double。GHC 怎么知道该选择哪个?

(即忽略扩展默认值)。

所以错误是不同的,因为错误的类型实际上不同的。

于 2013-01-31T18:35:56.690 回答