Languages such as Java and C# have first-order polymorphism because they allow us to
abstract on types. e.g. List<A>
can have a reverse
function that works on any
element type (the A
).
More practical programming languages and type systems[3] allow us to abstract on type constructors as well.
This feature is called higher-order (or higher-kinded) polymorphism.