In fact, I do not think this question is particularly suitable for strengths. There are whole books written about types. In fact, I would recommend Pierce to write Types and programming languages that I consider extremely enlightening and delightful.
As a quick answer (based mainly on what I remember from Pierce :-), here I take on these terms.
Parametric polymorphism refers to types with free variables in them, where variables can be replaced with any type. The List.length function is of this type because it can find the length of any list (regardless of the type of elements).
# List.length;; - : 'a list -> int = <fun>
One of the fantastic features of OCaml is that it not only supports types like this, it reveals them. To define a function, OCaml provides the most general parametrically polymorphic type for a function.
Subtyping is the relationship between types. A type T is a subtype of type U if all instances of T are also instances of U (but not necessarily vice versa). OCaml supports subtyping, i.e. Allows a program to process a value of type T as the value of its supertype U. However, the programmer must ask for it explicitly.
# type ab = [ `A | `B ];; type ab = [ `A | `B ] # type abc = [`A | `B | `C ];; type abc = [ `A | `B | `C ] # let x : ab = `A;; val x : ab = `A # let y : abc = x;; Error: This expression has type ab but an expression was expected of type abc. The first variant type does not allow tag(s) `C # let y : abc = (x :> abc);; val y : abc = `A
In this example, a type of type ab is a subtype of type abc , and x is of type ab . You can use x as a value of type abc , but you must explicitly convert using a type operator :> .
Ad-hoc polymorphism refers to polymorphism, which is determined by the programmer for specific cases, and not based on fundamental principles. (Or at least what I mean by this, maybe other people use this term differently.) A possible example of this is the OO inheritance hierarchy, where the actual state types of an object should not be related in any way while methods have the right relationship.
A key note about special polymorphism (IMHO) is that it allows the programmer to make it work. Therefore, this does not always work. Other types of polymorphism here, based on fundamental principles, actually cannot fail to work. This is a calming feeling when working with complex systems.