实例化类时编译错误

时间:2015-03-13 15:24:34

标签: haskell compiler-errors

class Hello a where
  method1 :: a -> String
  method1 a = "Hello"  

data World s = World [s]   

instance Hello a => World a where  
  method1 a = "Hello World"

当我将代码加载到Haskell时,我收到以下错误:

'method1'不是“世界”类的(可见)方法

有人能告诉我错误在哪里吗?

感谢。

1 个答案:

答案 0 :(得分:1)

instance没有多大意义。在类型上定义实例。可能的解决方法是:

instance Hello (World a) where
    method1 _ = "Hello World"

instance处理指定类型(或类型列表)在类上的映射方式,因此如果您的类C具有参数a,则可以指定:

class C a where
    foo :: a -> a

现在你不会为此付出太多代价,因为你从未说过哪些a实际适用于C。使用instance,您可以指定给定类型(这些类型可以是"泛型")适用于C,接下来您可以说:

instance C a where
    foo = id

这里你基本上说每个类型a(因此所有类型)都是C的实例。并且foo应该被视为id函数。

有时您希望在a上添加其他约束,a应该例如实例化另一个类。例如

instance (Integral i) => C i where
    foo = (+) 1

这里你说所有整数类型i都是C的实例,其中foo被定义为增量函数。 请注意,您不能简单地将此项与前一个实例相结合,因为Haskell在这种情况下不知道应该选择哪个。

或许您打算将实例定义为@bheklilr建议:

instance (Hello a) => Hello (World a) where
    method1 _ = "Hello World"