因此,当我编译以下代码时已编辑:
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?进行了一些澄清,但即使我无法修复它。
此外,当我为=~
使用==
和/~
等/=
等自定义运算符时,它是否相同,因为我得到了相同的错误?< / p>
编辑:根据要求:
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
答案 0 :(得分:6)
目前尚不清楚您要实现的目标。以下是一些想法:
当您声明类似instance (Eq a) => PartOrd a
的类的实例时,您应该为PartOrd a
中的函数提供实现(即partcmp
,而不是==
和/=
)。编译器确切地告诉您:==
和/=
在Eq
类,而不是PartOrd
,并且您没有业务定义不在PartOrd
中的函数。事实上,无论您使用的是==
,还是=~
或/~
,问题仍然存在:您不应该在partcmp
中定义其他内容。 {1}} 的。 instance (Eq a) => PartOrd a
部分只是说,在这些定义中,您可以假定已定义类型签名(Eq a) =>
的函数==
和/=
。
为什么在实例声明中使用列表?您可能想说(==), (/=) :: a -> a -> a
吗?如果确实想要说instance (Eq a) => PartOrd [a]
,那么您需要在GHC中打开instance (Eq a) => PartOrd a
(也许更多......)。 (但是,拥有FlexibleInstances
并没有意义。)
最后,函数instance (Eq a) => PartOrd a
和bigger
来自哪里?您无法在smaller
中使用它们,因为class (Eq a) => PartOrd a
是一般类型。你需要函数a
,在这种情况下你甚至不需要bigger, smaller :: a -> a -> a
类。