Haskell Binary treet med nøkkelverdi

stemmer
3

Jeg ønsker å bygge binært tre med nøkkelen - verdi blader med tuppel (k, v).

Min kode:

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

Nå prøver jeg å fylle dette treet:

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

Men jeg får denne feilmeldingen:

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

Hva er årsaken og hvordan kan jeg fikse det?

Publisert på 20/07/2011 klokken 17:38
kilden bruker
På andre språk...                            


1 svar

stemmer
6

Din typen er enten for generelle eller for spesifikke. Det bør være

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

eller

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

Den opprinnelige erklæring prøvde å sette (Int, Int)inn en Tree k v for alle k,v . Det sa at uansett hva slags tre du har, kan vi sette inn et par av Ints i den. Dette er helt klart tull, og som din underskrift for treeInsertindikerer, bare par av typen (k, v)kan settes inn i en Tree k v.

treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v
Svarte 20/07/2011 kl. 17:47
kilden bruker

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