There is a lot of confusion about types and monads, especially among people who’ve never used them to their full extent. In this post I wish to explore the motivations for having type systems and monads in a programming language, along with the trade-offs languages make on those matters. I will start with types, since that is the more familiar of the two concepts. I when talking about monads, I will draw a lot of parallels to types.