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

News
Featured functions

We just started a new section of the site called “Featured functions” which will house quick overviews of functions that we think deserve some extra love and attention. The first two featured functions are mapMaybe and intercalate.

Web Servers lesson 12 is about connection persistence – reusing the same socket for multiple HTTP requests. We write two versions of the server, one using lazy I/O and the other using strict ByteStrings.
Coercion and datatype contexts
Two new reference pages: A lengthy discussion of the coerce function, what it’s for, and how to use newtypes more effectively; and a note of historical interest on datatype contexts which addresses a common beginner question about typeclasses.
Object oriented Haskell
We have new lessons in two of our ongoing courses. In the fourth installment of the Timepieces course, Julie examines how the hierarchy of fltkhs is meant to mirror that of FLTK. The latest lesson in the Web Servers course is about parsing message bodies. And we’ve added to our documentation of GHC language extensions with an article on NumericUnderscores.
Return of the Clocks
This week we’re excited to bring you a new lesson in the native GUI course. In this lesson, Chris uses gtk3, Pango, and TVars to transform the blank application window into a clock. And the latest lesson in the Functortown course, in which Julie introduces the laws of the Bifunctor class and goes into more detail about how ranges and shrinkage work when you’re property testing with hedgehog.

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.