Thinking about Haskell?
Let's get started.
Whether you're just beginning, or ready to put principles into practice, we're your guide.

News
Our one-year anniversary celebration

Type Classes has been in business for a year. To celebrate and share our success, annual memberships are half-off through June 30.

Forward and back buttons

Quick site design update: We’ve added navigation buttons at the top of pages that are part of a series.

New: Monoid

A monoid is a type along with a binary associative operation and an identity element. We’ve written a comprehensive guide to monoids in Haskell.

Update: Using wildcards in type applications

Our guide to the many uses of underscore has been amended to include its usage with the type applications extension, which does not also require enabling partial type signatures.

New: map in Python and Haskell

The Python course continues with a discussion of map (with one iterator argument, or with multiple) and itertools.starmap. Again the Haskell is very similar, with mostly superficial differences resulting from Python’s arity-based overloading.

Update: Semigroup newtypes

We added documentation for the newtypes in the Data.Semigroup module, and with that the semigroup page is done.


Courses

Courses are series about a particular topic meant to be watched in order. Some will be more theory-and-fundamentals oriented, while some will focus on building a project. Each course has clearly identified prerequisites and goals, to help you choose which courses are right for you.

Web Servers, at a low level
6 videos; 49 minutes
This course starts by discussing what HTTP and web servers are and follows the HTTP specification in building a Haskell web server from scratch. This includes explaining different character encodings and the differences between the Haskell Text and ByteString types.
Functortown
This course will be a complete survey of functors, addressing such issues as what functors are in general and how the different functors are related to each other. It will be a long course, spending 3-5 lessons on each typeclass, and cover Functor, Bifunctor, Applicative, Traversable, Monad, Contravariant, and Profunctor, with motivating examples and discussions of what each is good for, the laws governing each, and how to property test instances.
Timepieces
Explore native GUI programming in Haskell! This course is all about making native clock applications. We’re starting off the course by alternating between Julie using fltkhs and Chris using gtk3. Each lesson explains aspects of the library, illuminates important Haskell concepts such as concurrency primitives and implicit parameters, and gives you some basis for comparing libraries for your own native GUI application projects.
The Validation Course
9 videos; 150 minutes
Starting from basic conditional statements and pattern matching, we build a suite of functions to validate user inputs, refactoring along the way to see what benefits using Maybe, Either, and Validation types brings, as well as using newtype to differentiate inputs. We also demonstrate the difference between Applicative and Monad.
NixOS on AWS
5 videos; 36 minutes
Writing a script with Turtle to launch/update an EC2 instance

Reference

Each article explains a single, sometimes small, Haskell topic in detail. Some articles include video. Haskell reference pages supplement, but are independent of, the courses and projects. Haskellers of any level will find them useful as reference.

Transformers and deriving
We walk through a common use case for ReaderT from the transformers library and use it to illustrate type aliases, newtypes, and various approaches for typeclass deriving, using the GeneralizedNewtypeDeriving and DerivingVia GHC extensions.
Thread concepts
Concurrency is a great strength of Haskell’s, in part thanks to the runtime system which provides lightweight threads. You can also create OS threads (called “bound” threads), which is sometimes needed for FFI.
Primitives, levity, and boxing
GHC makes it possible to access a lot of internals that most programming languages would hide away entirely. Rarely do you need them, but we get curious when we hear people talk about primitive, lifted, and boxed types.
Compile-time evaluation
A straightforward common application of the often-daunting Template Haskell: How to make constant expressions evaluate during compilation to avoid one source of runtime errors.
Understanding contravariance
23-minute video
Contravariant functors can seem difficult to approach, but in this article, we look at them as a variation on a familiar theme: function composition.
Understanding profunctors
Once you’ve understood contravariant functors, you are so ready for profunctors! Profunctors extend and generalize the concept of a functor, but under the hood, they’re still made of function composition.
Introduction to GHC language extensions
GHC Haskell has a lot of language extensions, ranging from very simple syntactic extensions to very complex type drama. This article helps you understand what extensions are, how to use them, and which ones are especially useful as your first extensions.
Type applications
7-minute video
One of the first language extensions we recommend for Haskell learners and one we use often while teaching, TypeApplications lets you visibly apply functions to type arguments. We demonstrate several common use cases.
Scoped type variables
9-minute video
Another useful language extension that we recommend for learners and pros alike, ScopedTypeVariables lets you extend the scope of a type variable over a whole function, including its subexpressions.
Overloaded strings
13-minute video
You will certainly run into this language extension often. This opinionated piece explains what it is and why it’s so common as well as when you might not want to use it.
Monomorphism restriction
Sometimes your functions aren’t as polymorphic as you thought they were. This article helps you understand why the monomorphism restriction exists and how to work with it.

Transitions

Switching to Haskell doesn’t mean you have to start over learning how to code. Our transitions content is geared toward explaining how concepts from other languages relate to Haskell, so you can advantage of what you already know as you get started in Haskell. We focus on Java, JavaScript, and Python.

Operators in JavaScript and Haskell
8-minute video
Transfer your knowledge of JS operator tricks into Haskell
A JavaScript WAT and monoidal folds
We examine a puzzling fact about Math.max() < Math.min() and what it has to do with monoids. This is a two-part article covering Haskell’s folds (compared to JavaScript reduce), monoids, and identity values.
Function decorators in Python
If you like Python decorators, you’ll love higher-order functions. Here we show a direct comparison between decorators in the Flask framework and higher-order functions in scotty, a Haskell web framework.

Tooling

This section covers topics that aren’t about the Haskell language itself, but about software that helps you be more productive with it.

Viewing type information in GHCi
Master the :type command and never be at a loss for knowledge of types
Typed holes
Get the compiler to help you develop code incrementally
GHCi configuration
Customize your Haskell REPL
Using ghcid
A simple but incredibly convenient tool that shows compile output in real-time as you edit.