使用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相同的错误。)
我将非常感谢您的帮助
答案 0 :(得分:0)
第一个错误指出Three
的{{1}}没有实例。如你所说,轻松!
然而,在第二种情况下,由于您的数字文字的类型是未知/多态的,GHC无法判断是是否为它们的实例。因此,错误不是关于缺失的实例,而是一个模糊的变量。
例如,您可以为Char
和Three
提供Int
的有效实例。 GHC如何知道选哪个?
(忽略延长的违约,即)。
因此错误是不同的,因为实际的错误类型不同。