This document discusses different types of polymorphism including ad-hoc polymorphism, parametric polymorphism, and subtyping polymorphism. It defines each type and provides examples of their implementation in code. Ad-hoc polymorphism is achieved through function overloading by changing argument types, number, or order. Parametric polymorphism allows functions and data types to work with different types through generics. Subtyping polymorphism involves overriding methods in subclasses to modify superclass behavior at runtime.