GHC exercises 🚀
OK, you know your monoids from your monads. You know how to write a terminal application or two. What's next? What are these language extensions that keep being mentioned? How "type-safe" can you really be?
This repository, I hope, will provide some stepping stones. We'll go through extensions one at a time, and build up a richer vocabulary for talking about Haskell programs, and look to move our assertions up into types, where they can be verified at compile time.
What this isn't.
This is a deep dive into GHC extensions, the power that each one gives us, and how we can combine extensions to achieve very strong guarantees at compile-time. This is not based around concepts; there won't be sections on "dependently-typed programming", or "generic programming", though these concepts will turn up throughout as we dig deeper into the extensions.
If you're interested in something more project-based, I absolutely, 1000% recommend Thinking with Types, written by Sandy Maguire. It is a fantastic resource, and one on which I already rely when explaining concepts to others.
Contents
GADTs
FlexibleInstances
KindSignatures
DataKinds
RankNTypes
TypeFamilies
ConstraintKinds
PolyKinds
MultiParamTypeClasses
FunctionalDependencies
Setup
Assuming you have Cabal or
Stack setup, you should be
able to navigate to any of the exercise*
directories, and run your usual
commands:
Repl
$ stack repl
$ cabal new-repl
Build
$ stack build
$ cabal new-build
It's going to make it a lot easier to iterate through the exercises if you
cabal install ghcid
or stack install ghcid
. Just as above, once this is
done, you can navigate to the exercise directory and run it with your preferred
repl command:
$ ghcid -c "stack repl"
$ ghcid -c "cabal new-repl"