Haskell 如何在没有派生的情况下引用Eq
对不起,我的英语很差。标题可能无法解释我的意思 在Data.Tree中,Haskell 如何在没有派生的情况下引用Eq,haskell,instance,typeclass,Haskell,Instance,Typeclass,对不起,我的英语很差。标题可能无法解释我的意思 在Data.Tree中,树定义如下: -- | Multi-way trees, also known as /rose trees/. data Tree a = Node { rootLabel :: a, -- ^ label value subForest :: Forest a -- ^ zero or more child trees } #ifdef __GLASGOW_HA
树
定义如下:
-- | Multi-way trees, also known as /rose trees/.
data Tree a = Node {
rootLabel :: a, -- ^ label value
subForest :: Forest a -- ^ zero or more child trees
}
#ifdef __GLASGOW_HASKELL__
deriving (Eq, Read, Show, Data)
#else
deriving (Eq, Read, Show)
#endif
它使用派生
来实例=
和/=
用于树
(日期)
我能做同样的事情而不去推导吗?
我尝试过这样的事情:
data Test a = Test a
instance Eq Test where
(Test a) == (Test b) = a == b
但它抛出了一个例外。我认为原因在于a和b的类型
如果我想用==
为我的数据定义自定义操作,我该怎么办
我知道我可以用
Functor
和fmap
来做这件事。但是我想使用=
像a==b
其中a=test1
和b=Test“a”
。有可能吗?您可以在树
或测试
上定义Eq的实例
,但您的定义存在一些问题
instance Eq Test where
(Test a) == (Test b) = a == b
第一个是Eq测试中的Test
仍然是参数化的。实际上,您编写了数据测试a=…
,这意味着存在一个类型参数。因此,您可以通过以下方式指定:
instance Eq (Test a) where
(Test y) == (Test x) = x == y
现在,如果a
也是Eq
的实例,则指定testa
是Eq
的实例
对于树
数据结构,Eq
的实例
应该如下所示:
instance (Eq a, Eq (Forest a)) => Eq (Tree a) where
(Tree x1 y1) == (Tree x2 y2) = x1 == x2 && y1 == y2
(当然,我在这里定义了两棵树是如何相等的,您可能希望以(语义上)不同的方式定义两棵树上的相等,因此您本身不应该复制粘贴此代码)
请注意,就像所说的那样,如果类型林a=[treeA]
,那么您可以省略Eq(林a)
类型约束,因为实例Eq a=>Eq[a]
保持不变。因此,在这种情况下:
instance Eq a => Eq (Tree a) where
(Tree x1 y1) == (Tree x2 y2) = x1 == x2 && y1 == y2
注意:林a
是[a]
的类型同义词,因此从技术上讲,Eq(林a)
约束是不必要的,因为Eq a
已经暗示了Eq[a]
。但考虑到问题的参数,这个答案很清楚。@luqui:你说得对。我不知道森林被定义为[treea]
(可能添加了一些额外的字段)。我在答案中加上了你的注释和一些评论。谢谢最后两个实例在Eq(树a)
中缺少Eq
。感谢@chi发现这一点。固定的。
instance Eq a => Eq (Tree a) where
(Tree x1 y1) == (Tree x2 y2) = x1 == x2 && y1 == y2