aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 1b9588f9f42986b300dafe3ea8220b694c41fd0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Real World Haskell solutions

These are solutions to exercises from me reading the first edition of the [the
Real World Haskell book](https://book.realworldhaskell.org/). I hope they will
be helpful in your journey to the world of Haskell.

The goal is to provide solutions to all the exercises. I'm adding them gradually
as I'm progressing through the book.

There is often more than one solution to an exercise. If your solution is
different but meets the assignment, it is the right one.

The intention is for the exercises to be solved as by a beginner, with all the
things that a seasoned Haskell programmer would have done differently. The
solutions should mostly use only knowledge from the preceding parts of the
book. Exceptions to this are cases where such approach would lead to too many
additional lines of code or to distracting the reader from the main idea of an
exercise. Advanced topics from the subsequent chapters should be avoided,
though.

## Exercises

There are a few kinds of exercises:

- Describe what happens when you run the code
- Answer a question
- Write an implementation

Solutions to the first two kinds of exercises are provided in comments.

Some exercises are not unambiguous. In these cases I describe my additional
assumptions and thought process in comments.

Some solution implementations depend on [the example code from the
book](https://resources.oreilly.com/examples/9780596514983). The complete
examples repository these solutions are base on is added as a submodule in the
'examples' directory. If a solution of an exercise depends on source files from
the examples, those files are copied to a directory of that solution.

Here is a list of the exercises. Format of an exercise label is
'\<chapter\>\_\<group\>\_\<exercise\>'. Some chapters contain more groups of
exercises. To differentiate those, an exercises group letter is included (the
exact letters don't have a connection to the book). To make the exercise groups
more visible in the list the first exercise of a group is in bold italics.


| Exercise       | Solved | Page | Chapter |
| -------------- | ------ | ---- | ------- |
| **_1_a_1_**    | yes    | 16   | 1. Getting started |
| 1_a_2          | yes    |      | |
| 1_a_3          | yes    |      | |
| 1_a_4          | yes    |      | |
| **_2_a_1_**    | yes    | 25   | 2. Types and functions |
| **_2_b_1_**    | yes    | 39   | |
| 2_b_2          | yes    |      | |
| 2_b_3          | yes    |      | |
| **_3_a_1_**    | yes    | 60   | 3. Defining types, streamlining functions |
| 3_a_2          | yes    |      | |
| **_3_b_1_**    | yes    | 69   | |
| 3_b_2          | yes, in 3_b_1 |      | |
| 3_b_3          | yes    |      | |
| 3_b_4          | yes    |      | |
| 3_b_5          | yes    |      | |
| 3_b_6          | yes    | 70   | |
| 3_b_7          | yes    |      | |
| 3_b_8          | yes    |      | |
| 3_b_9          | yes    |      | |
| 3_b_10         | yes, in 3_b_9 |      | |
| 3_b_11         | yes, in 3_b_9 |      | |
| 3_b_12         | yes, in 3_b_9 |      | |
| **_4_a_1_**    | yes    | 84   | 4. Functional programming |
| 4_a_2          | yes    |      | |
| 4_a_3          | yes    |      | |
| 4_a_4          | yes    |      | |
| **_4_b_1_**    | yes, in 4_b_2 | 97   | |
| 4_b_2          | yes    | 98   | |
| 4_b_3          | yes    |      | |
| 4_b_4          | yes    |      | |
| 4_b_5          | yes, in 4_b_6 |      | |
| 4_b_6          | yes    |      | |
| 4_b_7          | yes    |      | |
| 4_b_8          | yes, in 4_b_9 |      | |
| 4_b_9          | yes    |      | |
| 4_b_10         | yes    |      | |
| **_5_a_1_**    |        | 130  | 5. Writing a library: working with JSON data |
| 5_a_2          |        |      | |
| **_6_a_1_**    |        | 162  | 6. Using typeclasses |
| 6_a_2          |        |      | |
| **_8_a_1_**    |        | 205  | 8. Efficient file processing, regular expressions, and file name matching |
| 8_a_2          |        |      | |
| **_8_b_1_**    |        | 210  | |
| 8_b_2          |        |      | |
| 8_b_3          |        |      | |
| **_8_b_1_**    |        | 211  | |
| 8_b_2          |        |      | |
| **_8_d_1_**    |        | 212  | |
| **_9_a_1_**    |        | 221  | 9. I/O case study: a library for searching the filesystem |
| **_9_b_1_**    |        | 228  | |
| 9_b_2          |        |      | |
| 9_b_3          |        |      | |
| 9_b_4          |        |      | |
| **_9_c_1_**    |        | 232  | |
| 9_c_2          |        |      | |
| 9_c_3          |        |      | |
| **_9_d_1_**    |        | 234  | |
| 9_d_2          |        |      | |
| **_10_a_1_**   |        | 254  | 10. Code case study: parsing a binary data format |
| 10_a_2         |        |      | |
| 10_a_3         |        |      | |
| **_12_a_1_**   |        | 274  | 12. Barcode recognition |
| 12_a_2         |        |      | |
| 12_a_3         |        |      | |
| **_13_a_1_**   |        | 316  | 13. Data structures |
| **_14_a_1_**   |        | 352  | 14. Monads |
| **_15_a_1_**   |        | 382  | 15. Programming with monads |
| 15_a_2         |        |      | |
| 15_a_3         |        |      | |
| **_16_a_1_**   |        | 403  | 16. The Parsec parsing library |
| 16_a_2         |        |      | |
| 16_a_3         |        |      | |
| 16_a_4         |        |      | |
| **_18_a_1_**   |        | 436  | 18. Monad transformers |
| 18_a_2         |        |      | |
| 18_a_3         |        |      | |
| **_18_b_1_**   |        | 441  | |
| **_19_a_1_**   |        | 462  | 19. Error handling |
| **_19_b_1_**   |        | 465  | |
| 19_b_2         |        |      | |
| 19_b_3         |        |      | |
| **_23_a_1_**   |        | 529  | 23. GUI programming |
| 23_a_2         |        |      | |
| 23_a_3         |        |      | |
| **_24_a_1_**   |        | 542  | 24. Basic concurrent and parallel programming |
| 24_a_2         |        |      | |
| **_24_b_1_**   |        | 551  | |
| 24_b_2         |        |      | |
| **_26_a_1_**   |        | 610  | 26. Advanced library design: building a Bloom filter |
| 26_a_2         |        |      | |

## Bug reports

If you find an error in a solution or anything that should be described more
clearly, feel free to let me know by opening an issue here or a pull request
here.