OCaml's built-in list data type is really a recursive, parameterized variant. It is defined as follows:
type 'a list =  | :: of 'a * 'a list
list is really just a type constructor, with (value) constructors
 (which we pronounce "nil") and
:: (which we pronounce "cons").
The only reason you can't write that definition yourself in your own
code is that the compiler restricts you to constructor names that begin
with initial capital letters and that don't contain any punctuation
OCaml's built-in option data type is really a parameterized variant. It's defined as follows:
type 'a option = None | Some of 'a
option is really just a type constructor, with (value) constructors
You can see both
option defined in the Pervasives module
of the standard library.