Haskell Binary Baum mit Schlüssel-Wert

stimmen
3

Ich mag binären Baum mit Schlüsseln bauen - mit Tupel Wert Blättern (k, v).

Mein Code:

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))

Jetzt versuche ich, diesen Baum zu füllen:

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

Aber ich bekomme diese Fehlermeldung:

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

Was ist die Ursache und wie kann ich es beheben?

Veröffentlicht am 20/07/2011 um 18:38
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
6

Ihre Art ist entweder zu allgemein oder zu spezifisch. Es sollte sein

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

oder

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

Ihre ursprüngliche Erklärung versuchte einfügen (Int, Int)in ein Tree k v für jeden k,v . Es sagt , dass , egal welche Art von Baum Sie haben, können wir ein Paar einsetzen Ints drin. Dies ist eindeutig Unsinn, und als Signatur für treeInsertangibt, nur Paare vom Typ (k, v)können in eine eingefügt werden Tree k v.

treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v
Beantwortet am 20/07/2011 um 18:47
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more