2013-05-06 29 views
1

這裏是樹的代碼。如何修復(Ord(Tree a0))的無實例

import Control.Exception 
import Control.Monad 
import Control.DeepSeq 

import qualified Data.List as List 

import Test.HUnit 


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



insertTree :: (Ord a, Show a) => Tree a -> a -> Tree a 
insertTree Empty x = Node x Empty Empty 
insertTree (Node v tLeft tRight) x 
    | x == v = Node v tLeft tRight 
    | x < v = Node v (insertTree tLeft x) tRight 
    | x > v = Node v tLeft (insertTree tRight x) 


createTree :: (Ord a, Show a) => [ a ] -> Tree a 
createTree = foldl insertTree Empty 

member:: (Ord a, Show a) => Tree a -> a -> Bool 
member Empty x = False 
member (Node v tLeft tRight) x 
| x == v = True 
| x < v = member tLeft x 
| x > v = member tRight x 



intTree = createTree [ 9, 7, 2, 8, 6, 0, 5, 3, 1 ] 

listTree = createTree (List.permutations [ 0 .. 3 ]) 

strTree = createTree [ "hello" 
        , "world" 
        , "lorem" 
        , "ipsum" 
        , "dolor" 
        , "sit" 
        , "amet" 
        ] 

我的代碼基本上看看一個元素是否包含在樹內。 當我運行我的代碼 例如:ghci.> member 5 intTree 我得到一個錯誤沒有實例(Ord(Tree a0))。 我想知道我該如何解決這個問題。任何幫助是極大的讚賞。

+3

'member'依次接受樹和元素。 – 2013-05-06 05:34:54

+0

什麼n.m.說 - 你想評估'成員intTree 5' – ErikR 2013-05-06 05:43:44

+0

@ n.m .:你能寫出答案,以便問題可以被標記爲解決?謝謝。 – 2013-05-06 06:11:16

回答

5

no instance for ...錯誤幾乎總是因爲你在錯誤的地方得到你的論點。不幸的是,Possible fix: add an instance for...的建議通常是錯誤的。

在這種情況下,因爲member:: (Ord a, Show a) => Tree a -> a -> Bool,它首先需要它的樹,然後元素,所以你需要嘗試member intTree 5而不是member 5 intTree

相關問題