TypeConstructor
===============

In <:StandardML:Standard ML>, a type constructor is a function from
types to types.  Type constructors can be _nullary_, meaning that
they take no arguments, as in `char`, `int`, and `real`.
Type constructors can be _unary_, meaning that they take one
argument, as in `array`, `list`, and `vector`.  A program
can define a new type constructor in two ways: a `type` definition
or a `datatype` declaration.  User-defined type constructors can
can take any number of arguments.

[source,sml]
----
datatype t = T of int * real            (* 0 arguments *)
type 'a t = 'a * int                    (* 1 argument *)
datatype ('a, 'b) t = A | B of 'a * 'b  (* 2 arguments *)
type ('a, 'b, 'c) t = 'a * ('b  -> 'c)  (* 3 arguments *)
----

Here are the syntax rules for type constructor application.

 * Type constructor application is written in postfix.  So, one writes
 `int list`, not `list int`.

 * Unary type constructors drop the parens, so one writes
 `int list`, not `(int) list`.

 * Nullary type constructors drop the argument entirely, so one writes
 `int`, not `() int`.

 * N-ary type constructors use tuple notation; for example,
 `(int, real) t`.

 * Type constructor application associates to the left.  So,
 `int ref list` is the same as `(int ref) list`.
