Let's build a typesystem in Haskell!
In this video, I build a typesystem + interpreter from scratch for a simple language with integers and booleans. Initially I try to do this using algebraic data types, but I quickly run into problems because of limitations of the typesystem. Then I try another approach using GADTs (generalized algebraic data types) and everything smoothly falls into place.