2016-11-11 65 views
0

我目前正在做一个任务,我必须在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 

有人知道我在这里失踪了吗?

+1

~~你不显示你如何试图使用'isOrderedTree'。~~哎呀,你这样做,但一个无法读取由于格式。 – Zeta

+0

备注:此实现可能不正确,具体取决于“排序”的含义。例如,节点1(节点0无节点2无节点)无节点 - 在节点1的“小”子树中有'2' - 是否有序?你的功能对这种情况说什么? –

+0

@DanielWagner谢谢,我现在已经解决了这个问题。 – Alexander

回答

1

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

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

或者您可以使用GHC 8中的'-XTypeApplications',如'isOrderedTree @()Nil'或'isOrderedTree @Int Nil'。它比明确的类型规范更短。 – Shersh

+0

@chepner这解决了我的问题,谢谢! – Alexander