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'不是“世界”类的(可见)方法
有人能告诉我错误在哪里吗?
感谢。
答案 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"