parent
							
								
									290c50f5bd
								
							
						
					
					
						commit
						73d974fcfa
					
				
				 19 changed files with 318 additions and 0 deletions
			
			
		| @ -0,0 +1 @@ | ||||
| The answers to Chapter 1 exercises are available in the book. | ||||
| @ -0,0 +1,10 @@ | ||||
| # Exercises: A Head Code | ||||
| # Exercise 1 | ||||
| 1. Returns `5`  | ||||
| 2. Returns `5 * 5 = 25` | ||||
| 3. Returns `5 * 6 = 30` | ||||
| 4. Returns `3 + 3 = 6` | ||||
| 
 | ||||
| # Exercise 2 | ||||
| see src/practise.hs | ||||
| 
 | ||||
| @ -0,0 +1,25 @@ | ||||
| # Chapter Exercises | ||||
| # Parenthesization | ||||
| 1. `(2 + (2 * 3)) - 1` | ||||
| 2. `(^) 10 (1 + 1)` | ||||
| 3. `((2 ^ 2) * (4 ^ 5)) + 1` | ||||
| 
 | ||||
| # Equivalent expressions | ||||
| 1. Equivalent. | ||||
| 2. Equivalent. | ||||
| 3. Different. `(-) 37 400` is equal to `37 - 400` | ||||
| 4. Different. Integer division versus real division. | ||||
| 5. Different. Multiplication has higher precedence. | ||||
| 
 | ||||
| # More fun with functions | ||||
| In the REPL: | ||||
| 
 | ||||
| `let z = 7; x = y ^ 2; waxOn = x * 5; y = z + 8` | ||||
| 
 | ||||
| 1. `waxOn` is a number equal to `1125`. So it would be as if you replace `waxOn` by `1125`. | ||||
| 2. / | ||||
| 3. This will return `1125 * 3` or `3375` | ||||
| 4. see src/chapter.hs | ||||
| 5. see src/chapter.hs | ||||
| 6. see src/chapter.hs | ||||
| 7. waxOff is  basically an for the triple function. | ||||
| @ -0,0 +1,17 @@ | ||||
| # Exercises: Comprhension check | ||||
| ## Exercise 1 | ||||
| To declare these functions in the REPL, you need to prepend them with **let**. | ||||
| 
 | ||||
| `let half x = x / 2` | ||||
| 
 | ||||
| `let square x = x * x` | ||||
| 
 | ||||
| ## Excercise 2 | ||||
| In the REPL: | ||||
| 
 | ||||
| `let foo x = 3.14 * (x * x)` | ||||
| 
 | ||||
| ## Excercise 3 | ||||
| In the REPL: | ||||
| 
 | ||||
| `let bar x = pi * (x * x)` | ||||
| @ -0,0 +1,15 @@ | ||||
| # Exercises: Parentheses and Association | ||||
| ## Exercise 1 | ||||
| The parentheses change the result here. | ||||
| 
 | ||||
| Multiplication (*) has a higher precedence, so is normally evaluated first. By adding parentheses to the addition (+), the order in which terms are evaluated is changed. | ||||
| 
 | ||||
| ## Exercise 2 | ||||
| The parenthese do not change the result. | ||||
| 
 | ||||
| Parentheses surround mulitplication, but multiplication has a higher precedence, so it does not change anything. | ||||
| 
 | ||||
| ## Exercise 3 | ||||
| The parentheses change the result here. | ||||
| 
 | ||||
| Division (\\) has a higher precedence. By adding parentheses to the addition, the order in which terms are evaluated is changed. | ||||
| @ -0,0 +1,19 @@ | ||||
| # Exercises: Heal the Sick | ||||
| # Excercise 1 | ||||
| The space between 3. and 14 should be removed. | ||||
| 
 | ||||
| `let area x = 3.14 * (x * x)` | ||||
| 
 | ||||
| # Exercise 2 | ||||
| b is unknown is this definition, unless previously defined. The former will generate and error, the latter won't, but the intent of the function is to double the input, so `b` should be replaced by `x` | ||||
| 
 | ||||
| `let double x = x * 2` | ||||
| 
 | ||||
| # Exercise 3 | ||||
| The line should start at the same indentation. | ||||
| 
 | ||||
| ``` | ||||
| x = 7 | ||||
| y = 10 | ||||
| f = x + y | ||||
| ``` | ||||
| @ -0,0 +1,11 @@ | ||||
| -- 4 | ||||
| waxOn = x * 5 | ||||
|   where z = 7 | ||||
|         x = y ^ 2 | ||||
|         y = z + 8 | ||||
| 
 | ||||
| -- 5 | ||||
| triple x = x * 3 | ||||
| 
 | ||||
| -- 6 | ||||
| waxOff x = triple x | ||||
| @ -0,0 +1,38 @@ | ||||
| -- 2.5 Exercises: Comprehension check | ||||
| 
 | ||||
| -- Exercise 1 | ||||
| half x = x / 2 | ||||
| -- let half x = x / 2 | ||||
| 
 | ||||
| square x = x * x | ||||
| -- let square x = x * x | ||||
| 
 | ||||
| -- Exercise 2 | ||||
| foo x = 3.14 * (x * x) | ||||
| 
 | ||||
| -- Exercise 3 | ||||
| bar x = pi * (x * x) | ||||
| 
 | ||||
| -- 2.6 Exercises: Parentheses and Association | ||||
| 
 | ||||
| -- Exercise 1 | ||||
| -- aThey are different because * has priority over + | ||||
| 
 | ||||
| -- Exercise 2 | ||||
| -- Both are the same because * has priority over + | ||||
| 
 | ||||
| -- Exercise 3 | ||||
| -- They are different because / has priority over + | ||||
| 
 | ||||
| -- 2.7 Exercises: Heal the Sick | ||||
| 
 | ||||
| -- Exercise 1 | ||||
| -- let area x = 3.14 * (x*x) | ||||
| 
 | ||||
| -- Exercise 2 | ||||
| -- let double x = x *  2 | ||||
| 
 | ||||
| -- Exercise 3 | ||||
| x = 7 | ||||
| y = 18 | ||||
| f = x + y | ||||
| @ -0,0 +1,18 @@ | ||||
| -- The order of the where statements | ||||
| -- does not matter | ||||
| 
 | ||||
| -- 1 | ||||
| foo1 = x * 3 + y | ||||
|   where x = 3 | ||||
|         y = 1000 | ||||
| 
 | ||||
| -- 2 | ||||
| foo2 = x * 5 | ||||
|   where x = 10 * 5 + y | ||||
|         y = 10 | ||||
| 
 | ||||
| -- 3 | ||||
| foo3 = z / x + y | ||||
|   where x = 7 | ||||
|         y = negate x | ||||
|         z = y * 10 | ||||
| @ -0,0 +1,30 @@ | ||||
| # Chapter Exercises | ||||
| ## Reading syntax | ||||
| ### Excercise 1 | ||||
| 1. Correct | ||||
| 2. Incorrect, should be:  `(++) [1,2,3] [4,5,6] | ||||
| 3. Correct | ||||
| 4. Correct | ||||
| 5. Incorrect, should be:  `"hello" !! 4` | ||||
| 6. Correct | ||||
| 7. Incorrect, should be:  `take 4 "lovely"` | ||||
| 8. Correct | ||||
| 
 | ||||
| ### Exercise 2 | ||||
| 1. a -> d | ||||
| 2. b -> c | ||||
| 3. c -> e | ||||
| 4. d -> a | ||||
| 5. e -> b | ||||
| 
 | ||||
| ## Building functions | ||||
| # Exercise 1 | ||||
| 1. `"Curry is awesome" ++ "!"` | ||||
| 2. `("Curry is awesome!" !! 4) : ""` | ||||
| 3. `drop 9 "Curry is awesome!"` | ||||
| 
 | ||||
| # Exercises 2-5 | ||||
| see src/chapter3.hs | ||||
| 
 | ||||
| # Exercise 6 | ||||
| see src/reverse.hs | ||||
| @ -0,0 +1,5 @@ | ||||
| # Exercises: Scope | ||||
| 1. Yes. | ||||
| 2. No. (Assuming h is not defined previously) | ||||
| 3. No. r is not in scope. Also d is not in scope of r. | ||||
| 4. Yes. | ||||
| @ -0,0 +1,4 @@ | ||||
| # Exercises: Syntax Errors | ||||
| 1. Won't compile. Should be: `(++) [1,2,3] [4,5,6]` | ||||
| 2. Will not compile. Should be `"<3" ++ " Haskell"` | ||||
| 3. Will compile. | ||||
| @ -0,0 +1,34 @@ | ||||
| module Chapter3 where | ||||
| 
 | ||||
| -- Building Functions | ||||
| -- Exercise 2 | ||||
| -- This is just the most straighforward solution. Not very flexible. | ||||
| appendBang :: String -> String | ||||
| appendBang x = x ++ "!" | ||||
| 
 | ||||
| -- Again not very flexible, nor safe. Not every string has a fourth element. | ||||
| getFourth :: String -> String | ||||
| getFourth x = (x !! 4) : "" | ||||
| 
 | ||||
| -- Also not safe as there might not be enough characters to drop | ||||
| dropNine :: String -> String | ||||
| dropNine x = drop 9 x | ||||
| 
 | ||||
| -- Exercise 3 | ||||
| thirdLetter :: String -> Char | ||||
| thirdLetter x = x !! 2 | ||||
| 
 | ||||
| -- Exercise 4 | ||||
| letterIndex :: Int -> Char | ||||
| letterIndex x = "Curry is awesome!" !! x | ||||
| 
 | ||||
| -- Exercise 5 | ||||
| -- Because we only want this to work for "Curry is awesome", I've decided to | ||||
| -- only implement it as such and thus it returns just a String | ||||
| rvrs :: String | ||||
| rvrs =  | ||||
|     let s = "Curry is awesome" | ||||
|         start = take 5 s          -- "Curry" | ||||
|         mid   = take 4 $ drop 5 s -- " is " | ||||
|         end   = drop 9 s          -- "awesome"   | ||||
|     in end ++ mid ++ start | ||||
| @ -0,0 +1,11 @@ | ||||
| module Reverse where | ||||
| 
 | ||||
| rvrs :: String -> String | ||||
| rvrs s = end ++ mid ++ start | ||||
|     where start = take 5 s          -- "Curry" | ||||
|           mid   = take 4 $ drop 5 s -- " is " | ||||
|           end   = drop 9 s          -- "awesome" | ||||
| 
 | ||||
| main :: IO () | ||||
| -- main = print (rvrs "Curry is awesome") | ||||
| main = print $ rvrs "Curry is aweomse" | ||||
| @ -0,0 +1,6 @@ | ||||
| # Exercises: Mood Swings | ||||
| 1. Mood | ||||
| 2. Blah or Moot | ||||
| 3. Woot is not a type, but a value. You need a type in the type signature. It should be `changeMood :: Mood -> Mood` | ||||
| 4. see src/mood.hs | ||||
| 5. see src/mood.hs | ||||
| @ -0,0 +1,6 @@ | ||||
| # Exercises: Find the Mistakes | ||||
| 1. Incorrect, should be: `not True && True` | ||||
| 2. Incorrect, should be: `not (x == 6)` | ||||
| 3. Correct | ||||
| 4. Incorrect, should be: `["Merry"] > ["Happy"]` | ||||
| 5. Incorrect, mismatched types. | ||||
| @ -0,0 +1,31 @@ | ||||
| # Chapter Exercises | ||||
| 
 | ||||
| 1. `length :: [a] -> Int` (Why not `Integer`?) | ||||
| 2. Answers: | ||||
|    1. 5 | ||||
|    2. 3 | ||||
|    3. 2 | ||||
|    4. 5 | ||||
| 3. `(/)` takes two `Fractional` types. `length` returns and `Int` which is not `Fractional`. (`Float` and `Double` are) | ||||
| 4. Use `div` instead: `div 6 $ length [1, 2, 3]` | ||||
| 5. `Bool`. `True` (Note: `(+)` has higher precedence) | ||||
| 6. `Bool`. `False` | ||||
| 7. Answers: | ||||
|     1. Works. `Bool`. `True` | ||||
|     2. Won't work. List needs to have elements of the same type. | ||||
|     3. Works. `Int`. `5` | ||||
|     4. Works. `Bool`. `False` | ||||
|     5. Won't work. `(&&)` needs two `Bool`'s, `9` isn't one. | ||||
| 8. see src/chapter4.hs | ||||
| 9. see src/chapter4.hs | ||||
| 10. see src/chapter4.hs | ||||
| 
 | ||||
| ## Correcting syntax | ||||
| see src/chapter4.hs | ||||
| 
 | ||||
| ## Match the function names to their types | ||||
| 1. (c) | ||||
| 2. (b) | ||||
| 3. (a) | ||||
| 4. (d) | ||||
| 
 | ||||
| @ -0,0 +1,30 @@ | ||||
| module Chapter4 where | ||||
| 
 | ||||
| -- Chapter Exercises | ||||
| -- 8 | ||||
| isPalindrome :: (Eq a) => [a] -> Bool | ||||
| isPalindrome x = reverse x == x | ||||
| 
 | ||||
| -- 9 | ||||
| myAbs :: Integer -> Integer | ||||
| myAbs x = if x < 0 then negate x else x | ||||
| 
 | ||||
| -- 10 | ||||
| f :: (a,b) -> (c,d) -> ((b,d), (a,c)) | ||||
| f x y = ((snd x, snd y), (fst x, fst y)) | ||||
| 
 | ||||
| -- Correcting Syntax | ||||
| -- 1 | ||||
| myF :: String -> Int | ||||
| myF xs = w + 1 | ||||
|     where w = length xs | ||||
| 
 | ||||
| -- 2 | ||||
| myId :: a -> a | ||||
| myId x = x | ||||
| 
 | ||||
| -- 3 | ||||
| myFirst :: (a,b) -> a | ||||
| myFirst (a, _) = a | ||||
| -- or myFirst (a, b) = a | ||||
| -- or myFirst t = fst t | ||||
| @ -0,0 +1,7 @@ | ||||
| module Mood where | ||||
| 
 | ||||
| data Mood = Woot | Blah deriving Show | ||||
| 
 | ||||
| changeMood :: Mood -> Mood | ||||
| changeMood Blah = Woot | ||||
| changeMood _    = Blah | ||||
					Loading…
					
					
				
		Reference in new issue