Haskell Binaire boom met key-value

stemmen
3

Ik wil binaire boom met sleutel op te bouwen - waarde bladeren met tupel (k, v).

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

Nu probeer ik om deze boom te vullen:

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

Maar ik krijg deze fout:

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

Wat is de oorzaak en hoe kan ik dat op?

De vraag is gesteld op 20/07/2011 om 18:38
bron van user
In andere talen...                            


1 antwoorden

stemmen
6

Uw type is of te algemeen of te specifiek. Het moet

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

of

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

Uw oorspronkelijke verklaring probeerde in te voegen (Int, Int)in een Tree k v voor een k,v . Hij zei dat het niet uitmaakt wat voor soort boom je hebt, kunnen we een paar te voegen Ints erin. Dit is duidelijk onzin, en als uw handtekening voor treeInsertaangeeft, alleen paren van het type (k, v)kan worden in een ingebracht Tree k v.

treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v
antwoordde op 20/07/2011 om 18:47
bron van user

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