Awesome Open Source
Awesome Open Source

Learn Functional Programming course/tutorial on Scala Build Status Build Status


This course/tutorial was created with purpose to better understand functional programming idioms using Scala language. It covers type classes, monoids, functors, applicatives, monads, traversable/foldable, monad transformers, free monad.
Material is structured as set of stub/unimplemented functions/classes and tests for them. Your objective is to make all unit tests green. It is learn-by-doing course.

Example session

Example session


NICTA course was a great and interesting challenge for me to do in Haskell. I think Scala community will benefit from the similar course.

Target audience

The material in here is quite poor on theoretical/explanation part. I have tried to link material from other authors that I have found to be good into this course Readme to compensate for this. Some prior experience with functional idioms is recommended, but not necessary.

How to start

Just git clone this repository and follow steps in progression section. You can use any IDE and verify your results using sbt test. For me intellij works best - you can easily run individual tests out of it. In case if you got stuck - check answers branch.


It is important to keep the progression - a lot of things depend on each other. Implementing something = making all tests green for that thing.

Type classes


  • Observe general monoid pattern in learnfp/monoid/Monoid.scala
  • Implement learn-fp/src/main/scala/learnfp/monoid/ListMonoid.scala
  • Implement learn-fp/src/main/scala/learnfp/monoid/SimpleMonoid.scala
  • Implement learnfp/monoid/PairAdditiveMonoid.scala
  • Extra material:
    • Bartosz Milewski: Category Theory 3.1: Examples of categories, orders, monoids



  • Observe general monad pattern in learnfp/monad/Monad.scala
  • Implement learnfp/monad/Id.scala
  • Implement learnfp/monad/Maybe.scala
  • Implement learnfp/monad/List.scala
  • Implement learnfp/monad/Disjunction.scala
  • Implement learnfp/monad/Writer.scala
  • Implement learnfp/monad/State.scala
  • Extra material


  • Implement foldable in learnfp/foldable/Foldable.scala



  • Implement learnfp/traversable/Traversable.scala


  • Implement learnfp/nested/Nested.scala


  • Implement learnfp/io/IO.scala

Monad Transformers

  • Observe general monad transformer typeclass in learnfp/transformer/MonadTransformer.scala
  • Implement learnfp/transformer/IdT.scala
  • Implement learnfp/transformer/MaybeT.scala
  • Implement learnfp/transformer/WriterT.scala
  • Implement learnfp/transformer/StateT.scala
  • Extra material:

Free monad

Contravariant functor

  • Observe general contravariant functor pattern in learnfp/contravariant/ContravariantFunctor.scala
  • Implement learnfp/contravariant/Show.scala
  • Implement learnfp/contravariant/Predicate.scala


  • Observe general comonad pattern in learnfp/comonad/CoMonad.scala
  • Implement learnfp/comonad/Id.scala
  • Implement learnfp/comonad/Env.scala


  • Implement Reader functor, monad, applicative and write unit tests for that
  • Implement ReaderT and write unit tests for that
  • Implement applicative for monad transformers
  • Implement applicative for Free

What was left out

  • Reader/ReaderT
  • Eff


In case if find a bug/issue - please report it to or e-mail me on [email protected]
You also are very welcome to create PR.


  • Yuriy Netesov - initial implementation
  • Extra material references are owned by other authors

Alternative Project Comparisons
Related Awesome Lists
Top Programming Languages
Top Projects

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Scala (28,665
Tutorial (23,564
Course (20,740
Material (16,010
Functional Programming (10,972
Monad (1,928
Functor (546
Applicative (372
Typeclasses (303
Monoid (244
Monad Transformers (110
Comonads (13