I thought I'd try to keep notes as I go through the book as that seems to be a good way to prompt myself to actually use books (working through PAIP was very rewarding, so hopefully RWH will be a similar experience!) rather than just adorn my study with expensive door stops. This isn't meant to make particular sense, rather just a brain dump as I read through it.
So on with the book. Chapter 1 covers setting up the environment. There's a few interesting ghci commands I had not seen like
:set prompt
and :module + M
. :set +t
will always print the type of an expression. The "it" that is displayed is the name of a special variable which contains the value of the last expression evaluated. :info
displays the precedence of operators. For example / has higher precedence than +.Prelude> :info (+) class (Eq a, Show a) => Num a where (+) :: a -> a -> a ... -- Defined in GHC.Num infixl 6 + Prelude> :info (/) class (Num a) => Fractional a where (/) :: a -> a -> a ... -- Defined in GHC.Real infixl 7 /
An infix operator can be converted to a prefix operator by enclosing the operator in parentheses. Similarly, back-ticks can convert a prefix operator into an infix operator.
Enumerations are a way of producing lists of numbers. The Haskell Cheat Sheet gives a great summary of the possibilities.
[1..3] -> [1,2,3] [1..] -> [1,2,3,4,...] (infinite list) [10..1] -> [] (ranges only go forward) [0, -1 ..] -> [0, -1, -2, ...] (infinite list) [1,3..10] -> [1,3,5,7,9] (list from 1 to 10 with diff of 2) -- Also applies to any Enum class ['a' .. 'e'] -> "abcde" ['a', 'd' .. 'z'] -> "adgjmpsvy"
Don't use floating points for enumeration because the behaviour can be "quirky" (rounding errors and so on).
The empty string is a synonym for [] for the type Char,so
'a' : "" -> "a"
. Rational numbers are defined in the
Data.Ratio
module, and constructed with % (e.g. 22 % 7 is nearly Pi).The exercises showed me a function I'd not seen before.
interact
is a function which takes a function which takes stdin as input, and returns a string which is written to stdout (e.g. interact :: (String -> String) -> IO()
). Also, once I grokked that "wc" was referring to the Unix command it all became a little clearer!