| type-definition | ::= | type typedef  { and typedef } | 
| typedef | ::= | [type-params]  typeconstr-name  [type-information] | 
| type-information | ::= | [type-equation]  [type-representation]  { type-constraint } | 
| type-equation | ::= | = typexpr | 
| type-representation | ::= | = constr-decl  { | constr-decl } | 
|  | ∣ | = { field-decl  { ; field-decl } } | 
| type-params | ::= | type-param | 
|  | ∣ | ( type-param  { , type-param } ) | 
| type-param | ::= | ' ident | 
|  | ∣ | + ' ident | 
|  | ∣ | - ' ident | 
| constr-decl | ::= | constr-name | 
|  | ∣ | constr-name of  typexpr | 
| field-decl | ::= | field-name :  poly-typexpr | 
|  | ∣ | mutable field-name :  poly-typexpr | 
| type-constraint | ::= | constraint ' ident =  typexpr |