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.
- Observe general type class pattern in
learnfp/typeclass/TypeClass.scala
. - Implement
learnfp/typeclass/TotalOrder.scala
- Implement
learnfp/typeclass/Show.scala
- Implement
learnfp/typeclass/Eq.scala
- Extra material:
- 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 functor pattern in
learnfp/functor/Functor.scala
- Implement
learnfp/functor/Id.scala
- Implement
learnfp/functor/Maybe.scala
- Implement
learnfp/functor/List.scala
- Implement
learnfp/functor/Disjunction.scala
- Implement
learnfp/functor/Writer.scala
- Implement
learnfp/functor/State.scala
- Extra material:
- http://learnyouahaskell.com/functors-applicative-functors-and-monoids
- https://thedet.wordpress.com/2012/04/28/functors-monads-applicatives-can-be-so-simple/
- Bartosz Milewski: Category Theory 6.1: Functors
- 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
- Brian Beckman: Don't fear the Monad
- http://eed3si9n.com/learning-scalaz/Monad+transformers.html
- Implement foldable in
learnfp/foldable/Foldable.scala
- Observe general applicative pattern in
learnfp/applicative/Applicative.scala
- Implement
learnfp/applicative/Id.scala
- Implement
learnfp/applicative/Maybe.scala
- Implement
learnfp/applicative/List.scala
- Implement
learnfp/applicative/Disjunction.scala
- Implement
learnfp/applicative/Writer.scala
- Implement
learnfp/applicative/State.scala
- Extra material
- Implement
learnfp/traversable/Traversable.scala
- Implement
learnfp/nested/Nested.scala
- Implement
learnfp/io/IO.scala
- 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:
- Implement
learnfp/free/Free.scala
and pass all unit tests inlearn-fp/src/test/scala/learnfp/free/FreeTest.scala
- Extra material:
- 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
- Reader/ReaderT
- Eff
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.
- Yuriy Netesov - initial implementation
- Extra material references are owned by other authors