Take the 2017 Haskell Survey

A Haskell Study Syllabus

Learn professional-grade Haskell coding practices quickly and efficiently

Want more guidance in the learning process? Learn about FP Complete's training programs.

Contact us for Haskell training

FP Complete recommends the following syllabus to get up to speed with commercial-grade Haskell coding efficiently.

This outline provides a wide array of content, focused on practical lessons towards writing real-world applications. It presumes a basic knowledge of Haskell, as would be gained from books such as Haskell Programming from First Principles

Where available, we will provide links to online documentation on a topic.

Core information

You understand the basics of Haskell syntax and some common library functions. This section should get you up to speed with many commonly used features of Haskell, to provide a foundation for understanding code in general, and to follow the rest of this outline in particular.

Data structures

Covers some of the most commonly used data structures in Haskell, and the libraries providing them.

General patterns

This section demonstrates some common Haskell coding patterns, how they work, when they're useful, and possible pitfalls.

Testing

Serialization

  • store
  • binary/cereal
  • blaze-builder/bytestring-builder
  • blaze-html
  • attoparsec
  • aeson
  • yaml
  • xml-conduit/html-conduit
  • base16-bytestring/base64-bytestring

Standard programming needs

System programming

Streaming data (conduit)

Concurrency and parallelism

Simon Marlow's book Parallel and Concurrent Programming in Haskell is a highly recommended read on the subject. In addition, we have the following topics:

  • The async package
  • Common concurrency patterns (e.g., the auto-update package)
    • "Passing the baton" to control flow of execution between threads, using MVar for two threads, TVar for multiple threads
  • Concurrency patterns: worker threads, signals, blocking on TVars
  • STM: blocking semantics around mutable variables
  • resource-pool
  • handling errors (SlaveThread), restarting tasks, timeouts and other common patterns

Web programming

Web programming is another topic with many different approaches. Like streaming data, we need an overview of the different options, and then a drilldown on individual approaches. For now:

Big library guide

The following libraries are somewhat "large" in the sense that they address many different concerns.

  • lens
  • mono-traversable

Alternate Preludes

Sometimes it is useful to use an alternative to the standard Prelude. Reasons include avoiding cross-version incompatibility, support for better data structures, and avoiding partial functions. Here are some commonly used preludes (in alphabetical order).

  • base-prelude
  • basic-prelude
  • classy-prelude

Advanced topics

  • Primitive Haskell
  • Evaluation order and state tokens
  • Cabal trickery for backwards compatibility: Cabal CPP macros. Paths module. Flags. How to test for windows. Defaulting macros for ghci. Flags to either use new library version or another package (bytestring-builder) and set a CPP variable.
  • Constraint trick for instances; perhaps we can have a section for common type patterns (newtypes an obvious one, and also for example using Rank-N types to store a generic function in a data structure, versus existential types to store generic data).

Database Programming

Debugging/optimizing

  • hlint
  • Debugging
  • Profiling
  • Finding space leaks
  • Strictness annotations
  • Pragmas (UNPACK, INLINE, ...)
  • Heap profiling
  • Looking at GHC core

Code and project structuring

As a project grows, there are many "patterns" that might save developer some time by just doing some restructuring work. Some tricks might save development time, while others help to re-compile less.

  • Common Imports.hs module
  • Multiple executables depending on common library

Application infrastructure and support

As part of "commercial haskell", I think it would be great to have both, haskell-specific and non-specific description with examples in haskell for how do you manage all the standard needs for your application infrastructure and support. Some topics would include:

  • Deployment & service management
  • Monitoring and metrics (ekg, bosun)
  • Log handling techniques and the say package

Tell me about FP Complete training options

Don't forget to also check out our DevOps syllabus.