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