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.
NICTA course was a great and interesting challenge for me to do in Haskell. I think Scala community will benefit from the similar course.
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.
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.
learnfp/typeclass/TypeClass.scala
.learnfp/typeclass/TotalOrder.scala
learnfp/typeclass/Show.scala
learnfp/typeclass/Eq.scala
learnfp/monoid/Monoid.scala
learn-fp/src/main/scala/learnfp/monoid/ListMonoid.scala
learn-fp/src/main/scala/learnfp/monoid/SimpleMonoid.scala
learnfp/monoid/PairAdditiveMonoid.scala
learnfp/functor/Functor.scala
learnfp/functor/Id.scala
learnfp/functor/Maybe.scala
learnfp/functor/List.scala
learnfp/functor/Disjunction.scala
learnfp/functor/Writer.scala
learnfp/functor/State.scala
learnfp/monad/Monad.scala
learnfp/monad/Id.scala
learnfp/monad/Maybe.scala
learnfp/monad/List.scala
learnfp/monad/Disjunction.scala
learnfp/monad/Writer.scala
learnfp/monad/State.scala
learnfp/foldable/Foldable.scala
learnfp/applicative/Applicative.scala
learnfp/applicative/Id.scala
learnfp/applicative/Maybe.scala
learnfp/applicative/List.scala
learnfp/applicative/Disjunction.scala
learnfp/applicative/Writer.scala
learnfp/applicative/State.scala
learnfp/traversable/Traversable.scala
learnfp/nested/Nested.scala
learnfp/io/IO.scala
learnfp/transformer/MonadTransformer.scala
learnfp/transformer/IdT.scala
learnfp/transformer/MaybeT.scala
learnfp/transformer/WriterT.scala
learnfp/transformer/StateT.scala
learnfp/free/Free.scala
and pass all unit tests in learn-fp/src/test/scala/learnfp/free/FreeTest.scala
learnfp/contravariant/ContravariantFunctor.scala
learnfp/contravariant/Show.scala
learnfp/contravariant/Predicate.scala
learnfp/comonad/CoMonad.scala
learnfp/comonad/Id.scala
learnfp/comonad/Env.scala
In case if find a bug/issue - please report it to https://github.com/dehun/learn-fp/issues or e-mail me on [email protected]
You also are very welcome to create PR.