module Exercise where stops :: String stops = "pbtdkg" vowels :: String vowels = "aeiou" stopVowelStop :: [(Char, Char, Char)] stopVowelStop = filter p [(x, y, z) | x <- stops, y <- vowels, z <- stops] where p (a, _, _) = a == 'p' seekritFunc :: String -> Double seekritFunc x = (/) (fromIntegral (sum (map length (words x)))) (fromIntegral (length (words x))) myAnd :: [Bool] -> Bool myAnd = foldr (&&) True myOr :: [Bool] -> Bool myOr = foldr (||) False myAny :: (a -> Bool) -> [a] -> Bool myAny f = myOr . map f myElem :: Eq a => a -> [a] -> Bool myElem x = foldr (\y z -> z || (y == x)) False myElem' :: Eq a => a -> [a] -> Bool myElem' needle = any (\x -> x == needle) myReverse :: [a] -> [a] myReverse = foldl (flip (:)) [] myMap :: (a -> b) -> [a] -> [b] myMap f = foldr (\x y -> (f x) : y) [] myFilter :: (a -> Bool) -> [a] -> [a] myFilter f = foldr (\x xs -> if f x then x : xs else xs) [] squish :: [[a]] -> [a] squish = foldr (++) [] squishMap :: (a -> [b]) -> [a] -> [b] squishMap f xs = foldr (++) [] (map f xs) squishAgain :: [[a]] -> [a] squishAgain = squishMap id myMaximumBy :: (a -> a -> Ordering) -> [a] -> a myMaximumBy f (z:zs) = foldl (\x y -> if (f x y) == GT then x else y) z zs myMinimumBy :: (a -> a -> Ordering) -> [a] -> a myMinimumBy f (z:zs) = foldl (\x y -> if (f x y) == LT then x else y) z zs