因此,当我编译以下代码时:

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并没有任何意义。)
  • 最后,函数biggersmaller来自何处?您不能在class (Eq a) => PartOrd a中使用它们,因为a是常规类型。您将需要函数bigger, smaller :: a -> a -> a,在这种情况下,您甚至根本不需要PartOrd类。
  • 10-07 16:17