2016-11-11 67 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