Haskell 声明Eq(树a)的实例,其中如果两棵树具有相同的元素,则它们相等
我试图在Haskell中为我的树数据类型创建一个Eq(treea)实例,这样,如果两棵树具有相同的元素,那么它们是相等的。因此,我有一个方法,将我的树转换成一个列表(展平),然后比较排序后的列表。 但我得到的错误是,当我对列表排序时,没有(Ord a)的实例,或者当我==我的两个列表时,没有(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
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的实例。树是否有任何排序不变量?例如,它是一个搜索树吗?这将让你更有效地测试平等性。不,这只是一个非常简单的树,它只是教我们创建实例的一些练习。