MD_

Solutions to Haskell from First Principles


This is just one of many textbooks I'm working through on my quest to learn Haskell.

Chapter 1. Anything from Almost Nothing

1. $${(\lambda a b c . c b a)zz(\lambda w v.w)}$$ (Currying for clarity) $${(\lambda a . \lambda b . \lambda c . cba)(z)z(\lambda w . \lambda v.w)}$$ (Eliminate the head and apply the variiable) $${(\lambda b. \lambda c. cbz)(z)(\lambda w. \lambda v.w)}$$ (Eliminate from left to right, etc) $${(\lambda c. czz)(\lambda w. \lambda v.w)}$$ $${(\lambda w. \lambda v.w)(z)z}$$ $${(\lambda v . z)(z)}$$ (Becoming the singular:) $${z}$$ 2. $${(\lambda x. \lambda y.xyy)(\lambda a.a)b}$$ $${\lambda y.(\lambda a.a)yy)b}$$ $${\lambda a.a)(b)b}$$ $${b.b}$$

Chapter 2. Basic expressions and functions

Most arithmetic functions in Haskell (and math) are left-associative. So 2*3*4 is evaluated as (2*3)*4. Exponentiation is right-associative, so 2 ^ 3 ^ 4 is evaluated as 2 ^ ( 3 ^ 4). Unlike multiplication, which is commutative and not affected by order of operations, which expression we evaluate with exponentiation is more important. i.e.:

2 ^ 3 ^ 4
2417851639229258349412352

Whereas

(2 ^ 3) ^ 4
4096

Exercises: Parentheses and Association:

Here's some revision testing our intuitions around order-of-operations. In Haskell, we can get a numerical representation of the priority of an infix operator by running :info. i.e. :info (*)
7 *

1.
a) 8+7 *9
b) (8+7)* 9

Yes, parentheses change the evaluation of this equation.

2.
a) perimeter x y = (x *2) + (y+2)
b) perimeter x y = x * 2 + y * 2

No, as multiplication is already prioritised over addition, the evaluation result should be the same.

3.
a) f x = x / 2 + 9
b) f x = x / (2 + 9)

Yes, a will evaluate x / 2 first, while b will evaluate (2 + 9) first.