Subtyping is a tricky topic in programming language theory. The trickiness comes from a pair of frequently misunderstood phenomena called covariance and contravariance. This article will explain what these terms mean. A ≼ B means A is a subtype of B. A → B is the type of functions for which the argument type is A and the return type is B. x : A means x has type A. A motivating question