Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Scala with Cats

Copyright Noel Welsh and Dave Gurnell, 2014-2021.

Artwork by Jenny Clements.

Published by Underscore Consulting LLP.

Creative Commons Licence
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.


Scala with Cats teaches core functional abstractions of monoids, functors, monads, and applicative functors using the Cats library and a number of case studies.


The build requires a lot of heavy machinery: texlive, node, java, scala, and pandoc and pandoc-crossref. The simplest way to build it is to use Docker Compose with the provided shell scripts, Dockerfile, and docker-compose.yaml:

  • install Docker Compose (brew install docker-compose on OS X; or download from; and

  • run (or docker-compose run book bash if doesn't work).

This will open a bash shell running inside the Docker container that contains all the dependencies to build the book.

From the shell run sbt to open an SBT prompt, from which you can issue the following commands:

  • pdf builds a PDF version in dist/scala-with-cats.pdf;
  • html builds an HTML version in dist/scala-with-cats.html;
  • epub builds an ePub version in dist/scala-with-cats.epub;
  • all builds all three versions.

The pdf, html, and epub commands are each made of three smaller commands:

  • {foo}Setup creates temp directories and builds JS/CSS prerequisites for the HTML/ePub versions;
  • mdoc runs the files in src/pages through mdoc to compile and run the Scala snippets;
  • {foo}Pandoc runs the output of mdoc through pandoc to produce the output.

There are also tex and json commands (and commands like texSetup, jsonPandoc, and so on) that build a LaTeX version of the book and a Pandoc AST respectively. These are useful for debugging the build.


If you spot a typo or mistake, please feel free to fork the repo and submit a Pull Request. Add yourself to src/pages/intro/ to ensure we credit you for your contribution.

If you don't have time to submit a PR or you'd like to suggest a larger change to the content or structure of the book, please raise an issue instead.