functor (T : sig type 'a terminal type 'a nonterminal end) ->

  sig
    type 'a symbol =
        T : 'a T.terminal -> 'a symbol
      | N : 'a T.nonterminal -> 'a symbol
    type xsymbol = X : 'a symbol -> xsymbol
  end