Table of Contents

Haskell for Life

The goal of this short course is to familiarise the students with the computational model behind a mainstream high-abstraction functional programming language, with focus on developing practical skills. After having taken this course, the students will be able to solve practical programming problems of medium complexity by writing idiomatic Haskell code and making use of the rich library ecosystem.

The course is intended for a wide audience and only requires basic programming skills in one of the other mainstream languages (C/C++, Java, C#/.NET, Python, etc.).

The course relies heavily on showing actual interactive Haskell sessions and should be directly driven by feedback from the students.

The course consists of 4 parts, the first 3 of which introduce some essential concepts, and the last one focuses on practical examples of parallel and concurrent programming. The parts of the course may be taught over multiple sessions (of about 2 hours); in particular, the first part should most probably be spread over two sessions to help students digest the basic concepts. At the end of the course the students may be required to submit a course project. The students who submit a working course project may be awarded 2 ECTS.

The course is (somewhat loosely) based on the awesome book Real World Haskell.

The materials of this course are distributed under the Creative Commons Attribution Alone licence

1. Introduction

The fundamental ideas behind functional programming are introduced, with particular focus on handling functions as first-class values and on higher order functions. Strict and static typing discipline in Haskell is discussed and compared to typing disciplines in other mainstream programming languages. Basic syntax is described along with the explanations, including the syntax for definitions of simple data types.

The slides of this part are available here. This file contains the examples.

2. Typeclasses

Typeclasses in Haskell are introduced and compared to classes and types in other mainstream programming languages. Subtle differences are pointed out and discussed at length to avoid confusion.

The slides of this part are available here. This and this file contain the examples. The former file contains Unicode characters, so be sure to choose the correct Unicode encoding (UTF-8) to view it properly.

3. Monads

Monads as a way to encapsulate repetitive details of the computation are introduced. The Maybe and List monads are described. An overview of the monads Reader, Writer, and State is provided.

The slides of this part are available here. This file contains the examples.

4. Parallel and Concurrent Programming

Techniques of parallel and concurrent programming in Haskell are described. Sparks as building blocks for a parallel program are discussed. Spawning threads and synchronising them via thread-safe shared storage is covered. A basic port scanner is presented as a practical example.

The slides of this part are available here. The sorting example can be found here. The source code of the port scanner is available here.

For further details on parallel and concurrent programming in Haskell, check out Simon Marlow's tutorial.

5. Course Project/Final Exam

The subject for the exam in this course at the Technical University of Moldova can be found here (in Romanian).

Please, send your solutions to the E-mail address indicated in the PDF file.

The questions for the intermediate exam session can be downloaded here.


I taught this course at the Turku Center for Computer Science (January 2016), at Pentalog Chișinău (December 2016), and at the Faculty of Computer Science of the Technical University of Moldova (December 2016).

The exam subject for the version of the course taught at the Turku Center of Computer Science can be found here.