summaryrefslogtreecommitdiff
path: root/Haskell-book/09/src/Exercises.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-12-09 16:32:32 +0100
committerEugen Wissner <belka@caraus.de>2025-12-09 16:32:32 +0100
commit3624c712d72d246f21d4e710cec7c11e052e0326 (patch)
treef385cb51c72a0c5eeb2057609b75f5f8c6c4f272 /Haskell-book/09/src/Exercises.hs
parentc95abc31d62e296db4f1b537e3de440dd40defd1 (diff)
downloadbook-exercises-3624c712d72d246f21d4e710cec7c11e052e0326.tar.gz
Add the haskell book
Diffstat (limited to 'Haskell-book/09/src/Exercises.hs')
-rw-r--r--Haskell-book/09/src/Exercises.hs73
1 files changed, 73 insertions, 0 deletions
diff --git a/Haskell-book/09/src/Exercises.hs b/Haskell-book/09/src/Exercises.hs
new file mode 100644
index 0000000..52ff797
--- /dev/null
+++ b/Haskell-book/09/src/Exercises.hs
@@ -0,0 +1,73 @@
+module Exercises where
+
+-- direct recursion, not using (&&)
+myAnd :: [Bool] -> Bool
+myAnd [] = True
+myAnd (x:xs) =
+ if x == False
+ then False
+ else myAnd xs
+
+-- direct recursion, using (&&)
+myAnd' :: [Bool] -> Bool
+myAnd' [] = True
+myAnd' (x:xs) = x && myAnd' xs
+
+-- 1
+myOr :: [Bool] -> Bool
+myOr [] = False
+myOr (x:xs) = x || myOr xs
+
+-- 2
+myAny :: (a -> Bool) -> [a] -> Bool
+myAny f xs = myOr $ map f xs
+
+-- 3
+myElem :: Eq a => a -> [a] -> Bool
+myElem _ [] = False
+myElem y (x:xs) = (x == y) || (myElem y xs)
+
+-- 4
+myReverse :: [a] -> [a]
+myReverse [] = []
+myReverse (x:xs) = (myReverse xs) ++ [x]
+
+-- 5
+squish :: [[a]] -> [a]
+squish = squish' []
+ where squish' acc [] = acc
+ squish' acc (x:xs) = x ++ (squish' acc xs)
+
+-- 6
+squishMap :: (a -> [b]) -> [a] -> [b]
+squishMap _ [] = []
+squishMap f (x:xs) = (f x) ++ (squishMap f xs)
+
+-- 7
+squishAgain :: [[a]] -> [a]
+squishAgain x = squishMap id x
+
+-- 8
+myMaximumBy :: (a -> a -> Ordering)
+ -> [a] -> a
+myMaximumBy f (x:xs) = myMaximumBy' x xs
+ where myMaximumBy' m [] = m
+ myMaximumBy' m (y:ys)
+ | f y m == GT = myMaximumBy' y ys
+ | otherwise = myMaximumBy' m ys
+
+-- 9
+myMinimumBy :: (a -> a -> Ordering)
+ -> [a] -> a
+myMinimumBy f (x:xs) = myMinimumBy' x xs
+ where myMinimumBy' m [] = m
+ myMinimumBy' m (y:ys)
+ | f y m == LT = myMinimumBy' y ys
+ | otherwise = myMinimumBy' m ys
+
+-- 10
+myMaximum :: (Ord a) => [a] -> a
+myMaximum = myMaximumBy compare
+
+myMinimum :: (Ord a) => [a] -> a
+myMinimum = myMinimumBy compare