# Functor Variant_and_record_intf.M

    module M: functor (X : sig
    type 'a t

    This functor is essentially there because we use this same interface in different
         contexts, with different types for 'a t.

         1) One use case for it is where 'a X.t = 'a Typerep.t.  These interfaces are then
            part of the type witness built for a type containing a record or a variant in its
            structure. traverse will give a way of accessing the type representation for the
            arguments of a variant or record type.

         2) Another use case is for building "staged generic computations". In that case, the
            type 'a X.t is the type of the computation that is being built.  traverse
            returns the computation built for the argument. The interface no longer exports
            the typerep of the arguments in hopes of enforcing that no typerep traversal
            happens at runtime if the computation happen to be a function.

    end) -> sig .. end

Parameters:

`X`

:

`sig (** This functor is essentially there because we use this same interface in different contexts, with different types for ['a t]. 1) One use case for it is where ['a X.t = 'a Typerep.t]. These interfaces are then part of the type witness built for a type containing a record or a variant in its structure. [traverse] will give a way of accessing the type representation for the arguments of a variant or record type. 2) Another use case is for building "staged generic computations". In that case, the type ['a X.t] is the type of the computation that is being built. [traverse] returns the computation built for the argument. The interface no longer exports the typerep of the arguments in hopes of enforcing that no typerep traversal happens at runtime if the computation happen to be a function. *) type 'a t end`

    module Tag_internal: sig .. end

    module Tag: sig .. end

Witness of a tag, that is an item in a variant type, also called an "applied variant Constructor"

    module Variant_internal: sig .. end

    module Variant: sig .. end

    module Field_internal: sig .. end

    module Field: sig .. end

Witness of a field, that is an item in a record type.

    module Record_internal: sig .. end

    module Record: sig .. end