哈斯克尔:'=='不是(可见)类的方法

时间:2015-06-21 17:04:46

标签: haskell compiler-errors instance equality typeclass

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

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      

1 个答案:

答案 0 :(得分:6)

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

  1. 当您声明类似instance (Eq a) => PartOrd a的类的实例时,您应该为PartOrd a中的函数提供实现(即partcmp,而不是==/=)。编译器确切地告诉您:==/=Eq类,而不是PartOrd,并且您没有业务定义不在PartOrd中的函数。事实上,无论您使用的是==,还是=~/~,问题仍然存在:您不应该在partcmp中定义其他内容。 {1}} 的。 instance (Eq a) => PartOrd a部分只是说,在这些定义中,您可以假定已定义类型签名(Eq a) =>的函数==/=

  2. 为什么在实例声明中使用列表?您可能想说(==), (/=) :: a -> a -> a吗?如果确实想要说instance (Eq a) => PartOrd [a],那么您需要在GHC中打开instance (Eq a) => PartOrd a(也许更多......)。 (但是,拥有FlexibleInstances并没有意义。)

  3. 最后,函数instance (Eq a) => PartOrd abigger来自哪里?您无法在smaller中使用它们,因为class (Eq a) => PartOrd a是一般类型。你需要函数a,在这种情况下你甚至不需要bigger, smaller :: a -> a -> a类。