|
3 | 3 |
|
4 | 4 | > module Chapter9Exercises where
|
5 | 5 |
|
| 6 | +\begin{code} |
| 7 | +import Data.Bool (bool) |
| 8 | +import Data.Char |
| 9 | +\end{code} |
| 10 | + |
6 | 11 | \section{9.5 EnumFromTo}
|
7 | 12 |
|
8 | 13 | \begin{code}
|
@@ -66,5 +71,112 @@ e2' = [(x, y) | x <- mySqrs, y <- myCubes, x < 50, y < 50]
|
66 | 71 |
|
67 | 72 | -- 3. determine how many tuples inhabit your output list
|
68 | 73 | e3' = (length e1', length e2') -- 25, 15
|
| 74 | +\end{code} |
| 75 | + |
| 76 | + |
| 77 | +\section{9.8 Spines and nonstrict evaluation} |
| 78 | + |
| 79 | +Bottom Madness: will the following expressions return a value or be ⊥? |
| 80 | + |
| 81 | +\begin{code} |
| 82 | +-- b1 = [x^y | x <- [1..5], y <- [2, undefined]] -- ⊥ |
| 83 | +b2 = take 1 $ [x^y | x <- [1..5], y <- [2, undefined]] -- value ([1]) |
| 84 | +-- b3 = sum [1, undefined, 3] -- ⊥ |
| 85 | +b4 = length [1, 2, undefined] -- value (3) |
| 86 | +-- b5 = length $ [1, 2, 3] ++ undefined -- ⊥ |
| 87 | +b6 = take 1 $ filter even [1, 2, 3, undefined] -- value ([2]) |
| 88 | +-- b7 = take 1 $ filter even [1, 3, undefined] -- ⊥ |
| 89 | +b8 = take 1 $ filter odd [1, 3, undefined] -- value ([1]) |
| 90 | +b9 = take 2 $ filter odd [1, 3, undefined] -- value ([1, 3]) |
| 91 | +-- b10 = take 3 $ filter odd [1, 3, undefined] -- ⊥ |
| 92 | +\end{code} |
| 93 | + |
| 94 | +For each expression below, determine whether it’s in NF, WHNF, or neither. |
| 95 | + |
| 96 | +1. [1, 2, 3, 4, 5] -- NF |
| 97 | +2. 1 : 2 : 3 : 4 : _ -- WHNF |
| 98 | +3. enumFromTo 1 10 -- neither |
| 99 | +4. length [1, 2, 3, 4, 5] -- neither |
| 100 | +5. sum (enumFromTo 1 10) -- neither |
| 101 | +6. ['a'..'m'] ++ ['n'..'z'] -- neither |
| 102 | +7. (_, 'b') -- WHNF |
| 103 | + |
| 104 | + |
| 105 | +\section{9.9 Transforming lists of values} |
| 106 | + |
| 107 | +More Bottom |
| 108 | + |
| 109 | +\begin{code} |
| 110 | +-- mb1 = take 1 $ map (+1) [undefined, 2, 3] -- ⊥ |
| 111 | +mb2 = take 1 $ map (+1) [1, undefined, 3] -- value (2) |
| 112 | +-- mb3 = take 2 $ map (+1) [1, undefined, 3] -- ⊥ |
| 113 | +
|
| 114 | +itIsMystery xs = map (\x -> elem x "aeiou") xs -- creates list of bools predicated on vowels |
| 115 | +
|
| 116 | +mb5a = map (^2) [1..10] -- [1, 4, 9, 16 etc.] |
| 117 | +mb5b = map minimum [[1..10], [10..20], [20..30]] -- [1, 10, 20] |
| 118 | +mb5c = map sum [[1..5], [1..5], [1..5]] -- [15, 15, 15] |
| 119 | +
|
| 120 | +mb6 = map (\x -> bool x (-x) (x == 3)) |
| 121 | +\end{code} |
| 122 | + |
| 123 | + |
| 124 | +\section{9.10 Filtering lists of values} |
| 125 | + |
| 126 | +How might we write a filter function that would give us all the multiples of 3 out of a list from 1-30? |
| 127 | + |
| 128 | +\begin{code} |
| 129 | +getMultiple3 = filter (\x -> x `mod` 3 == 0) |
| 130 | +howManyMult3 = length . getMultiple3 |
| 131 | +removeArticles = unwords . filter (\s -> not $ s `elem` ["a", "an", "the"]) . words |
| 132 | +\end{code} |
| 133 | + |
| 134 | + |
| 135 | +\section{9.11 Zipping lists} |
| 136 | + |
| 137 | +\begin{code} |
| 138 | +myZip :: [a] -> [b] -> [(a, b)] |
| 139 | +myZip [] _ = [] |
| 140 | +myZip _ [] = [] |
| 141 | +myZip (x:xs) (y:ys) = (x, y) : myZip xs ys |
| 142 | +
|
| 143 | +myZipWith :: (a -> b -> c) -> [a] -> [b] -> [c] |
| 144 | +myZipWith _ [] _ = [] |
| 145 | +myZipWith _ _ [] = [] |
| 146 | +myZipWith f (x:xs) (y:ys) = f x y : myZipWith f xs ys |
| 147 | +
|
| 148 | +myZipB :: [a] -> [b] -> [(a, b)] |
| 149 | +myZipB = zipWith (,) |
| 150 | +\end{code} |
| 151 | + |
| 152 | + |
| 153 | +\section{9.12 Chapter Exercises} |
| 154 | + |
| 155 | +Data.Char: |
| 156 | + |
| 157 | +1. isUpper :: Char -> Bool; toUpper :: Char -> Char |
| 158 | + |
| 159 | +\begin{code} |
| 160 | +getUppers :: String -> String |
| 161 | +getUppers = filter isUpper |
| 162 | +
|
| 163 | +capitalize :: String -> String |
| 164 | +capitalize [] = [] |
| 165 | +capitalize (c:cs) = toUpper c : cs |
| 166 | +
|
| 167 | +allCaps :: String -> String |
| 168 | +-- allCaps [] = [] |
| 169 | +-- allCaps (c:cs) = toUpper c : allCaps cs |
| 170 | +allCaps = map toUpper |
| 171 | +
|
| 172 | +capFirst :: String -> Char |
| 173 | +capFirst = toUpper . head |
| 174 | +\end{code} |
| 175 | + |
| 176 | +Cipher: see 03-cipher.hs |
| 177 | + |
| 178 | +Implementing standard functions: |
| 179 | + |
| 180 | +\begin{code} |
69 | 181 |
|
70 | 182 | \end{code}
|
0 commit comments