因此,当我编译以下代码时:
instance (Eq a) => PartOrd a where
[] == [] = True
(x:xs) == (y:ys) = x==y && xs==ys
_ == _ = False
xs /= ys = not (xs == ys)
我得到:
`==' is not a (visible) method of class 'PartOrd'
`/=' is not a (visible) method of class 'PartOrd'
Failed, modules loaded: none.
我查看了How to properly instantiate classes in Haskell?进行了一些澄清,但即使我无法修复它,也无法解决。
另外,当我使用诸如
=~
的==
和/~
的/=
的自定义运算符时,是否会出现相同的错误?编辑:根据要求:
class Eq a => PartOrd a where
partcmp :: a -> a -> Maybe Ordering
partcmp x y = case bigger x y of
True -> Just LT
False -> case smaller x y of
True -> Just GT
False -> case x == y of
True -> Just EQ
False -> Nothing
最佳答案
目前尚不清楚您要实现的目标。这里有一些想法:
instance (Eq a) => PartOrd a
的类的实例时,应提供PartOrd a
中的功能实现(即partcmp
,而不是==
和/=
)。编译器确切地告诉您:==
和/=
在Eq
类中,不在PartOrd
中,并且您没有在PartOrd
中进行的业务定义函数。实际上,无论您使用==
,=~
还是/~
,问题依然存在:您不应该在partcmp
中定义除instance (Eq a) => PartOrd a
之外的任何内容。 (Eq a) =>
部分只是说,在这些定义中,您可以假定已定义类型为==
的函数/=
和(==), (/=) :: a -> a -> a
。 instance (Eq a) => PartOrd [a]
?如果您真的想说instance (Eq a) => PartOrd a
,则需要在GHC中打开FlexibleInstances
(也许还有更多其他功能...)。 (但是,使用instance (Eq a) => PartOrd a
并没有任何意义。)bigger
和smaller
来自何处?您不能在class (Eq a) => PartOrd a
中使用它们,因为a
是常规类型。您将需要函数bigger, smaller :: a -> a -> a
,在这种情况下,您甚至根本不需要PartOrd
类。