reverse' :: [a] -> [a] reverse' [] = [] reverse' (x:xs) = reverse' xs ++ [x] reverseH :: [a] -> [a] -> [a] reverseH [] ys = ys reverseH (x:xs) ys = reverseH xs (x:ys) reverse'' :: [a] -> [a] reverse'' l = reverseH l [] reverseH' :: [a] -> [a] -> [a] reverseH' l1 l2 = myfoldl (\ z y -> y:z) l2 l1 reverse''' :: [a] -> [a] reverse''' l = reverseH' l [] summation :: [Int] -> Int summation [] = 0 summation (x:xs) = x + summation xs -- filter filter' :: (a -> Bool) -> [a] -> [a] filter' f [] = [] filter' f (x:xs) = if f x then x : filter' f xs else filter' f xs length' :: [a] -> Int length' [] = 0 length' (x:xs) = 1 + length' xs length'' :: [a] -> Int length'' l = foldr' (\ x r -> 1 + r) 0 l append :: [a] -> [a] -> [a] append [] y = y append (x:xs) y = x : append xs y append' :: [a] -> [a] -> [a] append' l1 l2 = foldr' (\ x r -> (:) x r) l2 l1 foldr' :: (a -> b -> b) -> b -> [a] -> b foldr' f x [] = x foldr' f x (y:ys) = f y (foldr' f x ys) -- Higher order functions map' :: (a -> b) -> [a] -> [b] map' f [] = [] map' f (x:xs) = f x : map' f xs map'' :: (a -> b) -> [a] -> [b] map'' f l = foldr' (\ x r -> f x : r) [] l myfoldl :: (b -> a -> b) -> b -> [a] -> b myfoldl f x [] = x myfoldl f x (y:ys) = myfoldl f (f x y) ys summationH :: [Int] -> Int -> Int summationH [] x = x summationH (y:ys) x = summationH ys (y + x) summation' :: [Int] -> Int summation' l = summationH l 0 summationH' :: [Int] -> Int -> Int summationH' l x = myfoldl (\ z y -> y + z) x l summation'' :: [Int] -> Int summation'' l = summationH' l 0 data Pair a b = P a b first :: Pair a b -> a first (P x y) = x data Bool' = T | F deriving (Show, Eq) data List a = Nil | Cons a (List a) deriving (Show, Eq) l1 :: List Int l1 = Cons 1 (Cons 2 (Cons 3 Nil)) l2 :: List Int l2 = Cons 4 (Cons 5 (Cons 6 Nil)) my_append :: List a -> List a -> List a my_append Nil l = l my_append (Cons x xs) l = Cons x (my_append xs l) data Tree a = Leaf | Node a (Tree a) (Tree a) deriving (Show, Eq) tr1 :: Tree Int tr1 = Node 5 (Node 4 Leaf Leaf) (Node 6 (Node 7 Leaf Leaf) Leaf)