===========================
Type variable
:language(ocaml_type)
===========================

'a

---

(type
  (type_variable))

===========================
Constructed type
:language(ocaml_type)
===========================

M(M).t M.t t

---

(type
  (constructed_type
    (constructed_type
      (type_constructor_path
        (extended_module_path
          (extended_module_path
            (module_name))
          (extended_module_path
            (module_name)))
        (type_constructor))
      (type_constructor_path
        (extended_module_path
          (module_name))
        (type_constructor)))
    (type_constructor_path
      (type_constructor))))

===========================
Polymorphic variant type
:language(ocaml_type)
===========================

[`A | `B of t]

---

(type
  (polymorphic_variant_type
    (tag_specification
      (tag))
    (tag_specification
      (tag)
      (type_constructor_path
        (type_constructor)))))

===========================
Package types
:language(ocaml_type)
===========================

(module T)

---

(type
  (package_type
    (module_type_path
      (module_type_name))))

===========================
Function type
:language(ocaml_type)
===========================

l:t -> ?l:t -> t -> t

---

(type
  (function_type
    domain: (labeled_argument_type
      (label_name)
      type: (type_constructor_path
        (type_constructor)))
    codomain: (function_type
      domain: (labeled_argument_type
        (label_name)
        type: (type_constructor_path
          (type_constructor)))
      codomain: (function_type
        domain: (type_constructor_path
          (type_constructor))
        codomain: (type_constructor_path
          (type_constructor))))))

===========================
Tuple type
:language(ocaml_type)
===========================

t * t * t

---

(type
  (tuple_type
    (type_constructor_path
      (type_constructor))
    (type_constructor_path
      (type_constructor))
    (type_constructor_path
      (type_constructor))))

===========================
Aliased type
:language(ocaml_type)
===========================

t as 't

---

(type
  (aliased_type
    type: (type_constructor_path
      (type_constructor))
    alias: (type_variable)))

===========================
Parenthesized type
:language(ocaml_type)
===========================

(t)

---

(type
  (parenthesized_type
    (type_constructor_path
      (type_constructor))))
