The Craft of Functional Programming

*p 9*
The comment before the `square` function should read
``To square a number`'.

*p 78*
In the equation on line -9, the comment should read `by `(1),(2)`'.

*p 79*
The equation in the middle of the page should be

sumPowers n = power2 (n+1) - 1

*p 144*
Line -5, replace `double` by `times2`.

*p 173*
Replace `double` by `times2`, twice.

*p 175*
Replace `doubleList` by `double`, four times.

*p 190*
Add to the principle of extensionality `of the appropriate type'.

*p 190*
Exercise 7.21, replace all occurrences of `swap` by
`converse`.

*p 195*
Exercise 7.29, in the equation replace the ``&`' by
``$both`' and add the words

whereboth p q x = p x & q x.

*p 205*
At the foot of the page in the comment on `(1)`, the roles of
`[num]` and `[bool]` should be reversed.

*p 208*
The first paragraph should read: `The expression in each clause on the
right-hand side of an equation must unify to some type at least as general
as the type declared for the result of the function.'

*p 218*
The type of `showPerson` should be `people -> string`.

*p 224*
The type of `showExpr` should be `expr -> string`.

*p 230*
The type of `bEval` should be `bExp -> bool`.

*p 240*
There should not be a space between `::` and `=`
in definitions of `edit`.

*p 275*
The definition of the queue implementation should read

queue * == ([*],[*])

*Section 11.7*
Note that the `join` function is implemented in such a way that it only
guarantees that its result is a search tree if all elements of the first
argument are smaller than all elements of the second.

*p 289*
The implementation of `insert` given in the book is incorrect.
It should take account of whether the value `val` is a member of the
tree `(Node v n t1 t2)` when calculating the size of the resulting
tree. We therefore need to write

insert val (Node v n t1 t2) = Node v n t1 t2 , if v=val = Node v (1 + size t1 + size nt2) t1 nt2 , if val > v = Node v (1 + size nt1 + size t2) nt1 t2 , if val < v where nt1 = insert val t1 nt2 = insert val t2

*p 321*
The type of `routes` should be

relation * -> * -> * -> [[*]]

*p 323*
The type of `routesC` should be

relation * -> * -> * -> [*] -> [[*]]

*p 328*
The displayed block in the middle of the page should begin with the line

(digList $do digsToNum) "21a3"

*p 331*
Exercise 12.12. The type of the function `charlistToExpr` should be

with the examples beingcharlistToExpr :: [char] -> expr

and so on.charlistToExpr "234" = Lit 234

*p 347*
The local definition should read

waitTime (Discharge t w s) = w

*p 371*
Exercise 13.28, In the second equation replace `&` by `$both`.
Add after the equations the line `where `both` is defined in Exercise 7.29.'.

*p 382*
The second clause on the right hand side of the definition of
`mSort1` in exercise 14.14 should be followed by `, otherwise`.

*p 397*
Exercise 14.24, the first word should be `Give'.

*p 418*
The three equations at the foot of the page should be labelled `(4)`,
`(5)`, `(6)`.

*p 425*
On the first line, `being' should be `begin'.

Last modified 12 August 1997.