2011-07-20 8 views
3

タプル(k、v)でキー値リーフを持つバイナリツリーを構築したい。ハスケルキー値付きバイナリツリー

マイコード:でき

Couldn't match type `v' with `Int' 
     `v' is a rigid type variable bound by 
      the type signature for fillTree :: Int -> Tree k v -> Tree k v 

原因は何とどのように:私はこの木埋めるためにしようとしている今

data Tree k v = EmptyTree 
       | Node (k, v) (Tree k v) (Tree k v) 
       deriving (Show, Eq, Ord, Read) 

emptyTree :: (k,v) -> Tree k v 
emptyTree (k,v) = Node (k, v) EmptyTree EmptyTree 

treeInsert :: (Ord k) => (k,v) -> Tree k v -> Tree k v 
treeInsert (k,v) EmptyTree = emptyTree (k, v) 
treeInsert (a, b) (Node (k,v) left right) 
     | a == k = (Node (a,b) left right) 
     | a < k = (Node (a, b) (treeInsert (a, b) left) right) 
     | a > k = (Node (a, b) left (treeInsert (a, b) right)) 

fillTree :: Int -> Tree k v -> Tree k v 
fillTree x tree = treeInsert (x, x) tree 

をしかし、私はこのエラーを取得します私が直します?

+3

このような状況では、型シグネチャを削除し、GHCiでファイルを読み込み、コンパイラが*どのような型にするべきかを確認すると役に立ちます。 –

+2

'emptyTree'は本当に悪い名前です。誰もが' EmptyTree'を返すと期待しています。より良い名前は 'singleton'や' singleNode'のようなものです。 – Landei

答えて

6

あなたのタイプはあまりにも一般的すぎるか、またはあまりにも特殊です。それはあなたのオリジナルの宣言はどのkvためTree k v(Int, Int)を挿入しようとしていた

fillTree :: Int -> Tree Int Int -> Tree Int Int 

または

fillTree :: (Ord a) => a -> Tree a a -> Tree a a 

でなければなりません。あなたが持っているツリーの種類にかかわらず、Intのペアを挿入できると言っていました。これは明らかにナンセンスであり、treeInsertの署名が示すように、タイプ(k, v)のペアのみをTree k vに挿入できます。

treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v 
+0

あるいは、 '(Ord a)=> a - >ツリーa a - >ツリーa a'のようなものです。 –

+0

はい、ありがとうございます。 – 0xAX

関連する問題