These are type abbreviations. They are defined using ‘==’ as follows. They may be polymorphic.
:- type money == int. :- type assoc_list(KeyType, ValueType) == list(pair(KeyType, ValueType)).
Equivalence type definitions must be transparent. Unlike discriminated union type definitions, equivalence type definitions must not be cyclic; that is, the type on the left hand side of the ‘==’ (‘assoc_list’ and ‘money’ in the examples above) must not occur on the right hand side of the ‘==’.
Mercury treats an equivalence type as an abbreviation for the type on the right hand side of the definition; the two are equivalent in all respects in scopes where the equivalence type is visible.