{-
    Opgaver på ugeseddel 12
-}
module Ex2001 where

-- Opgave 3.a (og 3.c)

bin :: (Num a, Num b) => b -> [a]
bin 0 = [1]
bin n = [1] ++ zipWith (+) prev (tail prev) ++ [1]
  where
    prev = bin (n-1)

-- Opgave 3.b (og 3.c)

pascal :: (Num a, Num b) => a -> IO [b]
pascal 0 =
    do print [1]
       return [1]
pascal n =
    do prev <- pascal (n-1)
       now <- return ([1] ++ zipWith (+) prev (tail prev) ++ [1])
       print now
       return now

-- Opgave 4.a
{-
foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f z []      = z
foldl f z (x:xs)  = foldl f (f z x) xs

flip :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x
-}

sd :: Eq a => [a] -> [a] -> [a]
sd = foldl (flip (db (==)))

db :: (a -> b -> Bool) -> a -> [b] -> [b]
db f x [] = []
db f x (y:ys)
   | f x y     = ys
   | otherwise = y : db f x ys

{-
 - Typerne findes trinvis
 - Først   : db :: (a -> b -> Bool) -> a -> [b] -> [b]
 - dernæst : db (==) :: Eq a => a -> [a] -> [a]
 - og så   : flip (db (==)) :: Eq a => [a] -> a -> [a]
 - dette sættes sammen med foldl og man får resultatet...
 -}


