2015-12-07 39 views
3
data Bst a = Empty | Node (Bst a) a (Bst a) 

lElems :: Ord a => a -> Bst a -> Int 
lElems _ Empty = -1 
lElems n (Node l m r) 
       | n == m = n 
       | n > m = lElems n r 
       | n < m = lElems n l 

在這裏您會看到類型和程序的定義。如果它在樹中,我想返回元素,否則返回-1。Haskell,在bst中查找元素

However, I had this problem 
Couldn't match expected type `Int' with actual type `a' 
     `a' is a rigid type variable bound by 
      the type signature for lElems :: Ord a => a -> Bst a -> Int 
      at C:\Users\User\workspace\s\src\Main.hs:3:11 

有人能解釋我這裏有什麼問題嗎?

+7

「我想返回元素,如果它在樹中,則返回-1,否則返回-1」 - 如果元素不是數字,則沒有包含-1和元素值的類型。考慮使用Haskell風格的'Maybe',而不是錯誤的C風格錯誤報告。 –

回答

6

n == m的情況下,lElems返回n。從類型簽名中,函數聲明爲始終返回Int。這意味着,n必須Int,並且因此,不能任何Ord a

在返回之前,嘗試將n轉換爲Int;這可能會要求您進一步限制a,但。

如果找不到要查找的內容,請考慮將返回類型更改爲Maybe aEither值,而不是返回-1