Haskell:`=='不是(可见)类的方法

dim*_*im8 0 haskell compiler-errors equality instance typeclass

所以,当我编译下面编辑的代码时:

instance (Eq a) => PartOrd a where 
        [] == []         = True
        (x:xs) == (y:ys) = x==y && xs==ys
        _ == _           = False
        xs /= ys         = not (xs == ys)
Run Code Online (Sandbox Code Playgroud)

我明白了:

  `==' is not a (visible) method of class 'PartOrd'

  `/=' is not a (visible) method of class 'PartOrd'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

我已经看过如何在Haskell中正确实例化类?有些澄清,但即使我无法解决它.

另外,当我使用=~for ==/~for 等定制运算符时,它是否相同/=,因为我得到了同样的错误?

编辑:根据要求:

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      
Run Code Online (Sandbox Code Playgroud)

Ale*_*lec 6

目前尚不清楚你想要实现的目标.以下是一些想法:

  1. 当您声明类的实例时instance (Eq a) => PartOrd a,您应该提供函数的实现PartOrd a(即partcmp,not ==/=).编译器正好告诉你:==并且/=在类中Eq,而不是PartOrd,并且没有业务定义不在的函数PartOrd.事实上,你不管是否使用==,或=~或者/~,问题仍然存在:你不应该定义其他任何东西partcmpinstance (Eq a) => PartOrd a.该(Eq a) =>部分只是说,在这些定义中,您可以假定函数==/=类型签名(==), (/=) :: a -> a -> a已经定义.

  2. 为什么在实例声明中使用列表?你有意说instance (Eq a) => PartOrd [a]吗?如果你真的想说instance (Eq a) => PartOrd a,你需要FlexibleInstances在GHC中打开(也许更多的东西......).(但是,拥有它真的没有意义instance (Eq a) => PartOrd a.)

  3. 最后,在做功能biggersmaller从何而来?你不能使用它们class (Eq a) => PartOrd a,因为a它是一般类型.你需要函数bigger, smaller :: a -> a -> a,在这种情况下你甚至不需要这个PartOrd类.