Haskell 声明Eq(树a)的实例,其中如果两棵树具有相同的元素,则它们相等

Haskell 声明Eq(树a)的实例,其中如果两棵树具有相同的元素,则它们相等,haskell,types,tree,Haskell,Types,Tree,我试图在Haskell中为我的树数据类型创建一个Eq(treea)实例,这样,如果两棵树具有相同的元素,那么它们是相等的。因此,我有一个方法,将我的树转换成一个列表(展平),然后比较排序后的列表。 但我得到的错误是,当我对列表排序时,没有(Ord a)的实例,或者当我==我的两个列表时,没有(Eq a)的实例 import Data.List as L data Tree a = EmptyTree | Node (Tree a) a (Tree a) instance Eq (Tre

我试图在Haskell中为我的树数据类型创建一个Eq(treea)实例,这样,如果两棵树具有相同的元素,那么它们是相等的。因此,我有一个方法,将我的树转换成一个列表(展平),然后比较排序后的列表。 但我得到的错误是,当我对列表排序时,没有(Ord a)的实例,或者当我==我的两个列表时,没有(Eq a)的实例

import Data.List as L    
data Tree a = EmptyTree | Node (Tree a) a (Tree a)

instance Eq (Tree a) where     
 (==) t1 t2 = L.sort(flatten t1) == L.sort(flatten t2)

flatten :: Tree a -> [a]    
flatten EmptyTree = []    
faltten (Node x1 y x2) = [y] ++ (flatten x1) ++ (flatten x2)
我不知道为什么这个拒绝编译。我使用了一种方法,从列表中生成一棵树,并将该树展平,返回原始列表,因此我知道展平工作正常。我假设它抱怨不知道列表的内容是Ord还是Eq,但我不知道如何解决这个问题。添加

 (Ord a, Eq a) => 
对展平签名没有这样做。

问题不在于
展平
展平
不需要元素可排序,它只生成元素列表

问题在于,您在实现
(==)
时使用了
排序
,因此需要列表中的元素的类型是
Ord
类型类的实例

元素的类型还需要是
Eq
typeclass的成员,因为您随后在列表上调用
(==)
。但是,由于
Ord
意味着
Eq
,这在这里并不是一个真正的问题

因此,我们需要将这些类型约束添加到
实例
声明中:

instance Ord a => Eq (Tree a) where     
 (==) t1 t2 = L.sort(flatten t1) == L.sort(flatten t2)
实例Ord a=>Eq(树a),其中
(==)t1 t2=L.sort(展平t1)==L.sort(展平t2)

因此,这里我们只能检查两棵树是否相等,因为树包含的元素类型是
Ord
typeclass的实例。

树是否有任何排序不变量?例如,它是一个搜索树吗?这将让你更有效地测试平等性。不,这只是一个非常简单的树,它只是教我们创建实例的一些练习。