Errata: June 24, 2018
Thank you for purchasing Get Programming with Haskell. Please post any errors, other than those listed below, in the book's
Author Online Forum. We'll compile a comprehensive list and publish it here for everyone's convenience.
These errors occur in the book's first printing. Unless noted, these corrections have been made to the electronic versions.

Page ix:

In the acknowledgements, Vitaly Bragilevski's name is misspelled in one instance.

Page 4, electronic and print:

Page 31:

Aside from their role as a theoretical corner store of functional programming, they provide practical benefits.

should be:

Aside from their role as a theoretical cornerstone of functional programming, they provide practical benefits.

Page 34, print and electronic:

In the second and last paragraph, change ifEveninc to ifEvenInc.

Page 76, lesson 8:

There is a function with the following definition right before listing 8.1:

myLength xs = 1 + length (tail xs)

The definition should be:

myLength xs = 1 + myLength (tail xs)

(This is correct in listing 8.1.)

Page 87, print and electronic:

Delete the second passed in the following sentence:
The difference is that the function passed to `filter` must be passed a function that returns True or False.
It should be:
The difference is that the function passed to `filter` must be a function that returns True or False.

Page 153, lesson 14:

In the sidebar, "Creating types with newtype" the following sentence:

"Any type that you can define with newtype, you can also define using data.

The word "data" should be: in code font. This is also true of the last sentence:

"For simplicity, we'll stick to creating types with data throughout this book."

Page 158, lesson 15:

Page 169, print and electronic:

rotEncoder function is misspelled.

This allows you to create a common interface for any new ciphers you may write, as well as making working with rotEncode and applyOTP easier.

should be:

This allows you to create a common interface for any new ciphers you may write, as well as making working with rotEncoder and applyOTP easier.
In this example, you can use two type constructors that can either be a Name consisting of two Strings or a NameWithMiddle consisting of three Strings.

Page 177, print and electronic:

The Book data type in listing 16.2 isn't a correct translation.

data Book = Author String String Int

should be:

data Book = Book AuthorName String String Int Double

Page 181, print and electronic:

In this example, you can use two type constructors that can either be a FirstName consisting of two Strings or a NameWithMiddle consisting of three Strings.

should be:

In this example, you can use two type constructors that can either be a Name consisting of two Strings or a NameWithMiddle consisting of three Strings.

Page 188, lesson 17:

This is arguably not really an error, but technically, in Consider this:

"this" ++ " " ++ "is" ++ " " ++ "a" ++ " " ++ "bit" ++ "much"

should be:

"this" ++ " " ++ "is" ++ " " ++ "a" ++ " " ++ "bit" ++ " " ++ "much"

Page 194, lesson 17:

Some missing back ticks snuck through here, as well as missing >s after the GHCi. After listing 17.7 we see the following code:

As a refresher from lesson 35, open the palindrome-checker.cabal file in the projects root directory, find the executable section of the .cabal file, and append -Wall to the list of ghc- options as shown here: