我目前正在做一个任务,我必须在Haskell中创建一个二叉树。Ord在二叉树中的用法
我们必须使用下面的数据类型定义:
data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Ord,Show)
与价值无树是空的(有序)树和一个非空的树由一个值和两个子树。
我必须编写一个函数“isOrderedTree”,它对有序的树返回True,对无序的树返回False。
函数的定义如下:
isOrderedTree :: Ord a => Tree a -> Bool
isOrderedTree Nil = True
isOrderedTree (Node x Nil Nil) = True
isOrderedTree (Node x (Node y a b) Nil) = x > y && isOrderedTree (Node y a b) && x > getMax (getValues (Node y a b))
isOrderedTree (Node x Nil (Node y a b)) = y > x && isOrderedTree (Node y a b) && x < getMin (getValues (Node y a b))
isOrderedTree (Node x (Node y a b) (Node z c d)) = x > y && x < z && isOrderedTree (Node y a b) && isOrderedTree (Node z c d) && x > getMax (getValues (Node y a b)) && x < getMin (getValues (Node z c d))
我的问题是,下面的函数调用不起作用:
isOrderedTree Nil
我收到以下错误信息:
Ambiguous type variable ‘a0’ arising from a use of ‘isOrderedTree’ prevents the constraint ‘(Ord a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance (Ord a, Ord b) => Ord (Either a b)
instance Ord Ordering
instance Ord Integer
有人知道我在这里失踪了吗?
~~你不显示你如何试图使用'isOrderedTree'。~~哎呀,你这样做,但一个无法读取由于格式。 – Zeta
备注:此实现可能不正确,具体取决于“排序”的含义。例如,节点1(节点0无节点2无节点)无节点 - 在节点1的“小”子树中有'2' - 是否有序?你的功能对这种情况说什么? –
@DanielWagner谢谢,我现在已经解决了这个问题。 – Alexander