Search code examples
haskelltreefold

How to define listTree so that it returns a list containing all the elements in order?


listTree :: Tree a -> [a]
listTree = foldTree f z
    where
    f x y z  = x + y + z
    z = []

This is what I have so far, but my f is wrong because the expected type is Tree a -> [a] but the actual is Tree [a] -> [a]

data Tree a
   = Tip
   | Bin (Tree a) a (Tree a)
   deriving (Show, Eq)

foldTree :: (b -> a -> b -> b) -> b -> Tree a -> b
foldTree f z Tip         = z
foldTree f z (Bin l x r) = f (foldTree f z l) x (foldTree f z r)

This is fold and data type for tree.

Need help with defining f.


Solution

  • First of all, combining lists uses ++ in haskell. + is only used for adding numbers. Second, the variable y is of type a, not [a], so you cannot use ++ on it directly.

    listTree :: Tree a -> [a]
    listTree = foldTree f z
        where
        f x y z = x ++ [y] ++ z
        z = []