在Haskell中创建Eq类型类的实例时出错



我正在学习Haskell,并将编写一个小型决策图库作为一个启动项目。我已将数据类型声明为

data DD a = DDNode { var :: Int, vals :: [DD a]} | DDLeaf { val :: a} deriving (Show, Eq)

为了测试两个DD之间的相等性,我为DD创建了一个Eq的实例。它基本上与在树结构的情况下测试节点和叶的相等性相同。

instance (Eq a) => DD a where
(DDNode i vs) == (DDNode i' vs') = i == i' && vs == vs'
(DDLeaf v) == (DDLeaf v') = v == v'
_ ==  _ = False

当我在GHCi中加载带有上述代码的文件时,我会得到以下错误,

Prelude> :load decisionDiagrams.hs
[1 of 1] Compiling DecisionDiagram  ( decisionDiagrams.hs, interpreted )
decisionDiagrams.hs:9:19: error:
‘==’ is not a (visible) method of class ‘DD’
Failed, modules loaded: none.

我做错了什么?

不能在derivinginstance声明中都使用Eq,因为那时有两个实现。因此,应删除deriving (Eq)

data DD a
= DDNode { var :: Int, vals :: [DD a]}
| DDLeaf { val :: a}
deriving (Show)

您需要指定您正在定义Eq的实例,因此instance声明应该看起来像:

--                 ↓ defining an instance for Eq
instance (Eq a) =>Eq (DD a)where
-- …

您正在实现的Eq实例是Haskell可以自动派生的实例。因此,您不需要自己构造这样的实例:您可以使用deriving子句来实现这一点。因此,没有理由手动执行Eq

最新更新