{-
    Opgaver på ugeseddel 9
-}
module Exam2000 where

-- Opgave 1.a

-- map :: (a -> b) -> [a] -> [b]

-- map :: (c -> d) -> [c] -> [d]

-- Løsninger

map2 = map map :: [a -> b] -> [[a] -> [b]]

mapd = map . map :: (a -> b) -> [[a]] -> [[b]]

-- Opgave 3

data Htree a = Null | Fork a (Htree a) (Htree a)
             deriving (Show)

-- Opgave 3.a

levels :: [a] -> [[a]]
levels = levelsWith 1

levelsWith :: Int -> [a] -> [[a]]
levelsWith _ [] = []
levelsWith n xs = fst : levelsWith (n*2) lst
  where
    (fst, lst) = splitAt n xs


-- Opgave 3.b

mkHtrees :: [[a]] -> [Htree a]
mkHtrees = foldr addLayer [Null]

addLayer :: [a] -> [Htree a] -> [Htree a]
addLayer []     _          = []
addLayer (a:as) []         = Fork a Null Null : addLayer as []
addLayer (a:as) (t1:[])    = Fork a t1   Null : addLayer as []
addLayer (a:as) (t1:t2:ts) = Fork a t1   t2   : addLayer as ts


-- Opgave 3.c

mkHtree :: [a] -> Htree a
mkHtree = head . mkHtrees . levels

