What is the "right" way to add constraints on a type, to handle recursive structures with variants and to combine fragments of types?

A topic already exists (about objects per se rather than objects vs. modules) at Objects use cases in OCaml