A question that repeatedlypopsup about Cats is why monad transformer types like OptionT and EitherT aren’t covariant like their Option and Either counterparts. This blog post aims to answer that question. Covariance What does it mean to say that Option is covariant? It means that an Option[B] is allowed to be treated as an Option[A] if B is a subtype of A. For example: abstract class Err(val msg: String) final case class NotFound(id: Long) extends Err(s"Not found: $id") val optionNotFound: ...