summaryrefslogtreecommitdiff
path: root/Haskell-book/09/src/Exercises.hs
blob: 52ff79750be84a22411b78e623eaba0f080dc629 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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