Nemám přímo praktickou zkušenost s OCAML, ale řekl bych, že tam ekvivalentní konstrukce chybí, už třeba proto, že v OCAML není konstrukce na downcasting (přetypování na potomka v objektové hiararchii). V F# se využívá možností .NET runtimu, který dokáže vrátit typová metadata k objektu, či identifikovat jeho typ.
V OCAML to budete pravděpodobně donucen nějak obejít - pokud je množina použitých typů předem známa, můžete použít discriminated union a ten pak testovat přes pattern matching, což je bohužel nepohodlné, protože budete muset data neustále zaobalovat a rozbalovat.
Jinou možností je využít objektového rozšíření OCAMLu, které je použitelné, pokud je množina typů (value: 'a) otevřená.
Tam byste třeba nadefinoval metodu to_string(), která v každém podtypu vrací jméno. I tak byste asi musel vytvořit zaobalovací typ.