Haskell arbore binar cu cheie-valoare

voturi
3

Vreau să construiască arbore binar cu cheie - valoare cu tuple frunze (k, v).

Codul meu:

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

Acum am încercat să umple acest copac:

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

Dar am obține această eroare:

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

Care este cauza si cum pot repara?

Întrebat 20/07/2011 la 18:38
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
6

Tipul tau este fie prea generale sau prea specifice. Ar trebui să fie

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

sau

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

Declarația dvs. original a fost încercarea de a insera (Int, Int)într - o Tree k v pentru orice k,v . Se spunea că , indiferent de ce fel de copac ai, putem introduce o pereche de Inte în ea. Acest lucru este în mod clar un nonsens, și ca semnătură pentru treeInsertindica, numai perechi de tip (k, v)pot fi inserate într - o Tree k v.

treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v
Publicat 20/07/2011 la 18:47
sursa de către utilizator

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