- Every domain belongs to the type
`Type`

, but it is useful to be

able to assert more. *Categories*provide information about domain values, indicating what exports they must provide.- A basic category-valued expression gives a list of exports:
with { vertex: (%, Integer) -> Complex ; new: List Complex -> % }

- Categories may be used in declarations.
Polygon with { vertex: (%, Integer) -> Complex ; new: List Complex -> % } == add { Rep == List Complex; new(l: List Complex): % == per l; vertex(p: %, i: Integer): Complex == rep(p).i; }

- We may create category-valued constants.
define Monoid: Category == with { 1: %; *: (%, %) -> % } define Finite: Category == with { cardinality: Integer }

- The
`Join`

operator combines catgories, providing multiple inheritance:define FiniteMonoid: Category == Join(Monoid, Finite)

- One may use functions to compute categories:
define Module(R: Ring): Category == Ring with { *: (R, %) -> % } define ComplexCategory(R: Ring): Category == Module(R) with { complex: (R, R) -> R; real: % -> R; imag: % -> R; }

2003-06-06