Why algebraic data types are important
Bartosz Milewski