The author has concluded elsewhere[7] that one of the consequences of adopting the functional data model is that a consistent language design must allow types to vary at run-time. In other words, the language must allow the set of values making up a type to be computed (and recomputed, if necessary) at run-time. Such types are called dynamic types, since they represent dynamically varying sets of values.
Dynamic types make good sense in database-oriented languages. For example, if one declares
Parts = {1, ..., 1000}and one may also declare
Suppliers = {1, ..., 200}
P : set of Parts
S : set of Suppliers
Supplies : map from S to set of Pinstead of
Supplies : map from Suppliers to set of Partsthen the constraints that Supplies may only return sets of values that are in P, and may only be applied to values that are in S, are expressed in their most natural form.
Note that no special notation is needed to allow dynamic types. Any expression which can only be evaluated at run-time, and is used in the role of type, represents a dynamic type.