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)
目前尚不清楚你想要实现的目标.以下是一些想法:
当您声明类的实例时instance (Eq a) => PartOrd a,您应该提供函数的实现PartOrd a(即partcmp,not ==和/=).编译器正好告诉你:==并且/=在类中Eq,而不是PartOrd,并且没有业务定义不在的函数PartOrd.事实上,你不管是否使用==,或=~或者/~,问题仍然存在:你不应该定义其他任何东西partcmp在instance (Eq a) => PartOrd a.该(Eq a) =>部分只是说,在这些定义中,您可以假定函数==和/=类型签名(==), (/=) :: a -> a -> a已经定义.
为什么在实例声明中使用列表?你有意说instance (Eq a) => PartOrd [a]吗?如果你真的想说instance (Eq a) => PartOrd a,你需要FlexibleInstances在GHC中打开(也许更多的东西......).(但是,拥有它真的没有意义instance (Eq a) => PartOrd a.)
最后,在做功能bigger和smaller从何而来?你不能使用它们class (Eq a) => PartOrd a,因为a它是一般类型.你需要函数bigger, smaller :: a -> a -> a,在这种情况下你甚至不需要这个PartOrd类.