Update: A comprehensive version of this blog post was published at the 2017 Scala Symposium and is available for free through the ACM OpenTOC service. The corresponding talk can be found here. The common encoding of type classes in Scala relies on subtyping. This singular fact gives us a certain cleanliness in the code, but at what cost? Problem Consider the following hierarchy of type classes. A similar hierarchy can be found in both Cats and Scalaz 7. trait Functor[F[_]] trait Applicative[F...