head :: [a] -> a
meaning head has type function from "list of a" to "a" where "a" is a type variable). This is known as parametric polymorphism. Polymorphic typing allows strong type checking as well as generic functions. ML in 1976 was the first language with polymorphic typing.