Ord用于二叉树的用法

时间:2016-11-11 16:36:38

标签: haskell tree

我目前正在进行一项任务,我必须在Haskell中创建一个二叉树。

我们必须使用以下数据类型定义:

data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Ord,Show)

值为Nil的树是空(有序)树,非空树由值和两个子树组成。

我必须编写一个函数“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

有人知道我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:1)

您需要为Nil提供具体类型,即使特定类型并不重要。

-- All of the following should return True
isOrderedTree (Nil :: Tree ())
isOrderedTree (Nil :: Tree Integer)
isOrderedTree (Nil :: Tree Char)
-- etc