=pod =encoding utf8 =head1 NAME Muldis::D::Core::Types - Muldis D general purpose data types =head1 VERSION This document is Muldis::D::Core::Types version 0.148.0. =head1 PREFACE This document is part of the Muldis D language specification, whose root document is L; you should read that root document before you read this one, which provides subservient details. Moreover, you should read the L document before this current document, as that forms its own tree beneath a root document branch. =head1 DESCRIPTION These core data types are general-purpose in nature and are intended for use in defining or working with normal user data. =head1 TYPE SUMMARY This section shows all the data types and data type factories described in this document, arranged in a type graph according to their proper sub|supertype relationships. Since there are a number of types with multiple parents, those types may appear multiple times in the graph; moreover, the graph is displayed in multiple slices, some of which are different views of the same type relationships. As a notable exception, C is a proper subtype of I of the other types in this graph, but it is only shown once. This graph slice shows all of the top-level types as is relevant from the user's point of view: sys.std.Core.Type.Universal sys.std.Core.Type.Empty sys.std.Core.Type.Scalar sys.std.Core.Type.DHScalar sys.std.Core.Type.Bool sys.std.Core.Type.Int sys.std.Core.Type.Rat sys.std.Core.Type.Blob sys.std.Core.Type.Text sys.std.Core.Type.Tuple sys.std.Core.Type.DHTuple sys.std.Core.Type.Database sys.std.Core.Type.Relation sys.std.Core.Type.DHRelation sys.std.Core.Type.External This arrangement is user-significant for 2 main reasons. The first reason is that general semantics and intended interpretations of values and types fall into 4 main lines, represented by C. The second reason is that only values of the 3 deeply-homogeneous types shown above (C) may be used in a database; all values not of those types may only be used transiently. The fact that C is atomic while the other scalar types aren't is not relevant to users in the general case. This graph slice shows all of those same top-level types, plus a few more, as is relevant from the implementer's point of view: sys.std.Core.Type.Universal sys.std.Core.Type.Int sys.std.Core.Type.Cat.List sys.std.Core.Type.Cat.Structure sys.std.Core.Type.Cat.String sys.std.Core.Type.Tuple sys.std.Core.Type.DHTuple sys.std.Core.Type.Database sys.std.Core.Type.Relation sys.std.Core.Type.DHRelation sys.std.Core.Type.Cat.ScalarWP sys.std.Core.Type.Cat.DHScalarWP sys.std.Core.Type.Bool sys.std.Core.Type.Rat sys.std.Core.Type.Blob sys.std.Core.Type.Text sys.std.Core.Type.External sys.std.Core.Type.Cat.Nonstructure This arrangement is implementer-significant because it best illustrates the conceptual implementation of the types; C and C are the only 2 types that actually introduce values into the type system, and all other types are subset and/or union types composing their values; so, I Muldis D value either I an C or I a C. The fact that C composes both C and C values while C compose only C values is less important. This graph slice shows all of the general-purpose system-defined scalar types: sys.std.Core.Type.Universal sys.std.Core.Type.Scalar sys.std.Core.Type.Cat.ScalarWP sys.std.Core.Type.Cat.DHScalarWP sys.std.Core.Type.DHScalar sys.std.Core.Type.Int sys.std.Core.Type.NNInt sys.std.Core.Type.PInt sys.std.Core.Type.PInt2_N sys.std.Core.Type.Cat.String sys.std.Core.Type.Cat.DHScalarWP sys.std.Core.Type.Bool sys.std.Core.Type.Bool.* sys.std.Core.Type.Rat sys.std.Core.Type.NNRat sys.std.Core.Type.PRat sys.std.Core.Type.Blob sys.std.Core.Type.OctetBlob sys.std.Core.Type.Text sys.std.Core.Type.Text.Unicode sys.std.Core.Type.Text.Unicode.Canon sys.std.Core.Type.Text.Unicode.Compat sys.std.Core.Type.Text.ASCII sys.std.Core.Type.Text.Latin1 To be clear, C is the intersection type of C and C, and C is the intersection type of C and C; or, C is the union type of just C, C and C, and C is the union type of just C, C and C. This graph slice shows all of the general-purpose system-defined nonscalar type factories: sys.std.Core.Type.Universal sys.std.Core.Type.Cat.List sys.std.Core.Type.Cat.Structure sys.std.Core.Type.Tuple sys.std.Core.Type.DHTuple sys.std.Core.Type.Database sys.std.Core.Type.Set.T sys.std.Core.Type.DHSet.T sys.std.Core.Type.Array.T sys.std.Core.Type.DHArray.T sys.std.Core.Type.Bag.T sys.std.Core.Type.DHBag.T sys.std.Core.Type.SPInterval sys.std.Core.Type.DHSPInterval sys.std.Core.Type.Relation sys.std.Core.Type.DHRelation sys.std.Core.Type.Set sys.std.Core.Type.DHSet sys.std.Core.Type.Maybe sys.std.Core.Type.DHMaybe sys.std.Core.Type.Just sys.std.Core.Type.DHJust sys.std.Core.Type.Array sys.std.Core.Type.DHArray sys.std.Core.Type.Bag sys.std.Core.Type.DHBag sys.std.Core.Type.MPInterval sys.std.Core.Type.DHMPInterval This graph slice shows all of those same nonscalar types, with a different view of their relationships: sys.std.Core.Type.Universal sys.std.Core.Type.Cat.List sys.std.Core.Type.Cat.Structure sys.std.Core.Type.Tuple sys.std.Core.Type.DHTuple sys.std.Core.Type.Database sys.std.Core.Type.DHSet.T sys.std.Core.Type.DHArray.T sys.std.Core.Type.DHBag.T sys.std.Core.Type.DHSPInterval sys.std.Core.Type.Set.T sys.std.Core.Type.Array.T sys.std.Core.Type.Bag.T sys.std.Core.Type.SPInterval sys.std.Core.Type.Relation sys.std.Core.Type.DHRelation sys.std.Core.Type.DHSet sys.std.Core.Type.DHMaybe sys.std.Core.Type.DHJust sys.std.Core.Type.DHArray sys.std.Core.Type.DHBag sys.std.Core.Type.DHMPInterval sys.std.Core.Type.Set sys.std.Core.Type.Maybe sys.std.Core.Type.Just sys.std.Core.Type.Array sys.std.Core.Type.Bag sys.std.Core.Type.MPInterval To be clear, all of the nonscalar C-prefixed types except for C are intersection types of one of the latter two plus the same-named types sans the prefix. This graph slice shows all of the general-purpose system-defined types that compose any mixin types, shown grouped under the mixin types that they compose: sys.std.Core.Type.Universal sys.std.Core.Type.Ordered sys.std.Core.Type.Rat sys.std.Core.Type.Blob sys.std.Core.Type.Text sys.std.Core.Type.Ordinal sys.std.Core.Type.Bool sys.std.Core.Type.Int sys.std.Core.Type.Numeric sys.std.Core.Type.Int sys.std.Core.Type.Rat sys.std.Core.Type.Stringy sys.std.Core.Type.Blob sys.std.Core.Type.Array sys.std.Core.Type.Textual sys.std.Core.Type.Text sys.std.Core.Type.Attributive sys.std.Core.Type.Tuple sys.std.Core.Type.Relation sys.std.Core.Type.Collective sys.std.Core.Type.Set sys.std.Core.Type.Array sys.std.Core.Type.Bag sys.std.Core.Type.SPInterval sys.std.Core.Type.MPInterval =head1 MAXIMAL AND MINIMAL DATA TYPES These core data types are special and are the only Muldis D types (except for C) that are neither just scalar nor nonscalar nor external nor nonstructure types. They are all system-defined and it is impossible for users to define more types of this nature. =head2 sys.std.Core.Type.Universal The C type is the maximal type of the entire Muldis D type system, and contains every value that can possibly exist. Every other (non-aliased) type is implicitly a proper subtype of C, and C is implicitly a union type over all other types. Its default value is C. The cardinality of this type is infinity. C is the nullary-domain-intersection type. Considering the low-level type system, C is the domain-union type of just the 2 types C and C. =head2 sys.std.Core.Type.Empty The C type is the minimal type of the entire Muldis D type system, and is the only type that contains exactly zero values. Every other (non-aliased) type is implicitly a proper supertype of C and C is implicitly an intersection type over all other types. It has no default value. The cardinality of this type is zero. C is the nullary-domain-union type. Considering the low-level type system, C is the domain-intersection type of just the 2 types C and C. =head1 GENERIC MIXIN DATA TYPES =head2 sys.std.Core.Type.Ordered The C type is a mixin (union) type that is intended to be explicitly composed by all other types that are considered I. An ordered type is a type for which one can take all of its values and place them on a line such that each value is definatively considered I all of the values one one side and I all of the values on the other side. A typical ordered type is a scalar type, but not-scalar types can also be ordered. Almost all system-defined scalar types are also ordered types, including: C, C, C, C, C. The cardinality of C is infinity. The default value of C is C. The minimum and maximum values of C are C<-Inf> and C, respectively; these 2 values are special singleton scalar types that are canonically considered to be before and after, respectively, I other value of the Muldis D type system, regardless of whether those values are composed into an ordered type. =head2 sys.std.Core.Type.Ordinal The C type is a mixin (union) type that is intended to be explicitly composed by all other types that are considered I. An ordinal type is an ordered type for which one can take any one of its values and derive a definitive predecessor or successor value, iff the initial value isn't the first or last value on the line. Similarly, one can take any two values of an ordinal type and produce an ordered list of all of that value's types which are on the line between those two values. The C type explicitly composes the C mixin type, and so every type which explicitly composes C also implicitly composes C. Just a few system-defined ordered types are also ordinal types, including: C, C. A primary quality of a type that is ordered but not ordinal is that you can take any two values of that type and then find a third value of that type which lies between the first two on the line; by definition for an ordinal type, there is no third value between one of its values and that value's predecessor or successor value. The cardinality of C is infinity; its default and minimum and maximum values are the same as those of C. For some ordinal types, there is the concept of a I or I, where every consecutive pair of values on that type's value line are conceptually spaced apart at equal distances; this distance would be the quantum, and all steps along the value line are at exact multiples of that quantum. However, ordinal types in general don't need to be like this, and there can be different amounts of conceivable distance between consecutive values; an ordinal type is just required to know where all the values are. =head2 sys.std.Core.Type.Numeric The C type is a mixin (union) type that is intended to be explicitly composed by all other types that are considered I. A numeric type is a type with whose values it would be reasonable to apply all of the common mathematical operators like C<+>, C<->, C<*>, C. Just a few primary system-defined types are numeric types, including C and C. The cardinality of C is infinity. The default value of C is the C value zero. The C type is not itself ordered, but often a type which is numeric is also ordered. Muldis D does not currently have any system-defined complex number types, but if it did, they conceivably would also compose C; but in that case, it may prove useful to split the C mixin into itself and a C mixin. =head2 sys.std.Core.Type.Stringy The C type is a mixin (union) type that is intended to be explicitly composed by all other types that are considered I, which for the moment also includes any types whose values are an ordered collection of elements, such as arrays. A stringy type is a type with whose values it would be reasonable to apply all of the common string or array operators like C<~> or C<~#>. Just a few primary system-defined types are stringy types, including C, C, and C. The cardinality of C is infinity. The default value of C is the C value empty string. The C type is not itself ordered, but often a type which is stringy is also ordered. =head2 sys.std.Core.Type.Textual The C type is a mixin (union) type that is intended to be explicitly composed by all other types that are considered I, that is those types whose values are strings of characters. The C type explicitly composes the C mixin type, and so every type which explicitly composes C also implicitly composes C. Most existing or likely system-defined stringy types are also textual types, including C. The cardinality of C is infinity. The default value of C is the C value empty string. The C type is not itself ordered, but often a type which is textual is also ordered. =head2 sys.std.Core.Type.Attributive The C type is a mixin (union) type that is intended to be explicitly composed by other types that are considered to be collections of named attributes, such as generic tuples and relations. Just a few primary system-defined types are attributive types, namely C and C. The cardinality of C is infinity. The default value of C is C. I type could conceivably compose C as well, but for now it doesn't, because it still differs from C and C in several ways such that virtual routines composed for C and C would be impractical to compose for C in general, but that might change later.> =head2 sys.std.Core.Type.Collective The C type is a mixin (union) type that is intended to be explicitly composed by other types that are effectively simple homogeneous collections of values, and something more specific than relations in general. Just a few primary system-defined types are collective types, including C, C, C, C, and C. The cardinality of C is infinity. The default value of C is C. =head1 GENERIC SCALAR DATA TYPES These core scalar data types are the most fundamental Muldis D types. Plain Text Muldis D provides a specific syntax per type to select a value of every one of these types (or of their super/subtypes), which does not look like a routine invocation, but rather like a scalar literal in a typical programming language; details of that syntax are not given here, but in L. Hosted Data Muldis D as hosted in another language will essentially use literals of corresponding host language types, whatever they use for eg booleans and integers and character strings, but tagged with extra metadata if the host language is more weakly typed or lacks one-to-one type correspondence; see L or L for a Perl 6|5-based example. These types, except for C and C, are all ordered. =head2 sys.std.Core.Type.Scalar The C type is the maximal type of all Muldis D scalar types, and contains every scalar value that can possibly exist. Every other (non-aliased) scalar type is implicitly a proper subtype of C, and C is implicitly a union type over all other scalar types. Its default value is C. The cardinality of this type is infinity. Considering the low-level type system, C is just the union type of these 3 types: C, C, C. =head2 sys.std.Core.Type.DHScalar C is a proper subtype of C where every one of its possreps' attributes is restricted to be of just certain categories of data types, rather than allowing any data types at all; related to this restriction, any dh-scalar value is allowed to be stored in a global/persisting relational database but any other scalar value may only be used for transient data. The C type is the maximal type of all Muldis D dh-scalar types, and contains every dh-scalar value that can possibly exist. Every other (non-aliased) dh-scalar type is implicitly a proper subtype of C, and C is implicitly a union type over all other dh-scalar types. Its default value is C. The cardinality of this type is infinity. Considering the low-level type system, C is just the union type of these 3 types: C, C, C. =head2 sys.std.Core.Type.Bool The C type is explicitly defined as a union type over just these 2 singleton types having C-format names: C and C. A C represents a truth value, and is the result type of any C or C routine; it is the only essential general-purpose scalar data type of a generic B language, although not the only essential one in Muldis D. The default and minimum value of C is C; its maximum value is C. The cardinality of this type is 2. The C type explicitly composes the C mixin type, and by extension also implicitly composes the C mixin type. The C type has a default ordering algorithm that corresponds directly to the sequence in which its values are documented here; C is ordered before C. The value C is also known as C and I and C<⊥>. The value C is also known as C and I and C<⊤>. =head2 sys.std.Core.Type.Bool.* There are exactly 2 types having C-format names; for the rest of this description, the type name C will be used as a proxy for each and every one of them. A C has 1 system-defined possrep whose name is the empty string and which has zero attributes. The cardinality of this type is 1, and its only value is its default and minimum and maximum value. =head2 sys.std.Core.Type.Int An C is a single exact integral number of any magnitude. The C type explicitly composes the C mixin type. Its default value is zero; its minimum and maximum values are conceptually infinities and practically impossible. C is one of just two scalar root types (the other is C) that do I have any possreps. C is also the only atomic type in the Muldis D type system. The cardinality of this type is infinity; to define a most-generalized finite C subtype, you must specify the 2 integer end-points of the inclusive range that all its values are in. The C type explicitly composes the C mixin type, and by extension also implicitly composes the C mixin type. The C type has a default ordering algorithm; for 2 distinct C values, the value closer to negative infinity is ordered before the value closer to positive infinity. =head2 sys.std.Core.Type.NNInt C (non-negative integer) is a proper subtype of C where all member values are greater than or equal to zero. Its minimum value is zero. =head2 sys.std.Core.Type.PInt C (positive integer) is a proper subtype of C where all member values are greater than zero. Its default and minimum value is 1. =head2 sys.std.Core.Type.PInt2_N C is a proper subtype of C where all member values are greater than 1. Its default and minimum value is 2. =head2 sys.std.Core.Type.Rat A C (scalar) is a single exact rational number of any magnitude and precision. The C type explicitly composes the C mixin type. It is conceptually a composite type with 2 main system-defined possreps, called C and C, both of which are defined over several C. The C possrep consists of 2 attributes: C (an C), C (a C); the conceptual value of a C is the result of rational-dividing its C by its C. Because in the general case there are an infinite set of [C,C] integer pairs that denote the same rational value, the C possrep carries the normalization constraint that C and C must be coprime, that is, they have no common integer factors other than 1. The C possrep consists of 3 attributes: C (an C), C (a C), C (an C); the conceptual value of a C is the result of multiplying its C by the result of taking its C to the power of its C. The C possrep carries the normalization constraint that among all the [C,C,C] triples which would denote the same rational value, the only allowed triple is the one having both the C with the lowest value (that is closest to or equal to 2) and the C with the highest value (that is closest to positive infinity). I The default value of C is zero; its minimum and maximum values are conceptually infinities and practically impossible. The cardinality of this type is infinity; to define a most-generalized finite C subtype, you must specify the greatest magnitude value denominator, plus the 2 integer end-points of the inclusive range of the value numerator; or alternately you must specify the greatest magnitude value mantissa (the I of the number), and specify the greatest magnitude value radix, plus the 2 integer end-points of the inclusive range of the value exponent (the I of the number). Common subtypes specify that the normalized radixes of all their values are either 2 or 10; types such as these will easily map exactly to common human or physical numeric representations, so they tend to perform better. The C type explicitly composes the C mixin type. The C type has a default ordering algorithm which is conceptually the same as for C; for 2 distinct C values, the value closer to negative infinity is ordered before the value closer to positive infinity. The C type has an implementation hint for less intelligent Muldis D implementations, that suggests using the C possrep as the basis for the physical representation. =head2 sys.std.Core.Type.NNRat C (non-negative rational) is a proper subtype of C where all member values are greater than or equal to zero (that is, the C|C is greater than or equal to zero). Its minimum value is zero. =head2 sys.std.Core.Type.PRat C (positive rational) is a proper subtype of C where all member values are greater than zero (that is, the C|C is greater than zero). Its default and minimum value is 1. =head2 sys.std.Core.Type.Blob A C is an undifferentiated string of bits. The C type explicitly composes the C mixin type. A C has 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string; each element of C is either C<0> to represent a low bit or C<1> to represent a high bit. The C type explicitly composes the C mixin type. A C is a simple wrapper for a C and all of its other details such as default and minimum and maximum values and cardinality and default ordering algorithm all correspond directly. But C is explicitly disjoint from C due to having a different intended interpretation. =head2 sys.std.Core.Type.OctetBlob C is a proper subtype of C where all member values have a length in bits that is an even multiple of 8 (or is zero). C adds 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string. The C and C possreps correspond as you might expect, such that each element of the sole attribute of C maps to 8 consecutive elements of the sole attribute of C; with each 8 bits corresponding to an octet, the lowest-element-indexed bit corresponds to the highest bit of the octet when the latter is encoded as a standard two's complement binary unsigned integer, and the highest-element-indeed bit corresponds to the lowest bit of the octet. The reason the C type is system-defined as distinct from C is for convenience of users since it is likely the vast majority of C values consist of whole octets and users would want to work with them in those terms. =head2 sys.std.Core.Type.Text A C is a string of abstract characters. The C type explicitly composes the C mixin type, and by extension also implicitly composes the C mixin type. A C has 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string; each element of C is an integer representing an abstract character codepoint of an infinite-size proprietary abstract character repertoire, with each unique integer corresponding to a unique character. The C type explicitly composes the C mixin type. A C is a simple wrapper for a C and all of its other details such as default and minimum and maximum values and cardinality and default ordering algorithm (matching and sorting is numeric by codepoint integer) all correspond directly. But C is explicitly disjoint from C due to having a different intended interpretation. The formal definition of the C type does not define any abstract characters itself. Rather, the actual abstract characters in C's repertoire are all defined by the proper subtypes of C that each formally declare a character set, and the union of these is the repertoire of C; how such a said proper subtype declares a character set is by adding at least one possrep capable of representing strings of characters of that set. The set of such subtypes of C would collectively define mappings between their own possreps and C, either directly or indirectly. The C type is officially compatible with the Unicode standard version 6.0.0, and so all proper subtypes of C may only define character sets whose common characters with Unicode would cleanly map bidirectionally with the latter; most well known character sets do this, but for any others, they would be defined as some C-composing type that is disjoint from C. I Officially the actual integer strings used by C for abstract characters is both implementation-defined and unstable, so user code should typically never reference this possrep directly; similarly, the natural ordering of C is officially implementation-defined and unstable. The official way to have character string types that naturally sort in a way that is correct for some particular nationality is by having a disjoint C-composing type with a C-typed possrep attribute and the wrapper type would define the desired ordering algorithm itself. Similarly, any concept of nationality-specific graphemes is best expressed in a wrapper. C is more agnostic and generic in these matters. It is likely each implementation will make C resemble the largest well known character set that it knows about, typically Unicode. I formally identical to Unicode for all element integers in 0..2^21, and to ASCII for all in 0..127, and then the subtypes could be defined in a normal and independent/portable way. Maybe we need to formally define what higher ranges HKSCS/etc map to.> =head2 sys.std.Core.Type.Text.Unicode C is a proper subtype of C where all member values have just the abstract characters in the character repertoire of the Unicode standard version 6.0.0; the integer codepoint space that Unicode reserves for itself is 0..0x10FFFF, of which it currently has about 10% allocated. C adds the 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string; each element of C represents a Unicode standard version 6.0.0 character abstract codepoint number. C values in general do not conform to any Unicode normal form, so the same string can contain graphemes in both composed and decomposed formats, and two strings with the same graphemes in different such formats will compare as unequal. C also adds the 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string; C represents each codepoint as a sequence of 1..4 octets in the UTF-8 encoding; the number of octets used varies by codepoint as follows: 1 for 0x0..0x7F, 2 for 0x80..0x7FF, 3 for 0x800..0xFFFF, 4 for 0x10000..0x10FFFF. =head2 sys.std.Core.Type.Text.Unicode.Canon C is a proper subtype of C where all member values are semantically in canonical decomposed normal form (NFD) and whose C-defined possreps are properly formatted NFD. Two C will generally match at the grapheme abstraction level. Of course, a Muldis D implementation doesn't actually have to store character data in NFD; but default matching semantics need to be as if it did, and NFD is what the aforementioned possreps would format it in. =head2 sys.std.Core.Type.Text.Unicode.Compat C is a proper subtype of C where all member values are semantically in compatibility decomposed normal form (NFKD) and whose C-defined possreps are properly formatted NFKD. While typical applications would likely prefer C, more security-conscious applications may likely prefer C. =head2 sys.std.Core.Type.Text.ASCII C is a proper subtype of C (and of C) where all member values have just the abstract characters in the 128-character repertoire of 7-bit ASCII. For these values, the C and C possreps have identical (C) attribute values, each element in which is in the range 0..127 inclusive. C adds 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string and whose value is identical to said other two possrep attribute values. =head2 sys.std.Core.Type.Text.Latin1 C is a proper subtype of C (and a proper supertype of C) where all member values have just the abstract characters in the 256-character repertoire of 8-bit ISO Latin 1 / ISO-8859-1. C adds 1 system-defined possrep named C which consists of 1 C-typed attribute whose name is the empty string and each of whose elements is a codepoint in the range 0..255 inclusive, and also doubles as the octet format of said codepoint in the Latin 1 encoding. The C and C possreps correspond as you might expect, such that both represent the same abstract characters using the appropriate codepoints of their repertoires. =head1 GENERIC NONSCALAR DATA TYPES These core nonscalar data types permit transparent/user-visible compositions of multiple values into other conceptual values. For all nonscalar types, their cardinality is mainly or wholly dependent on the data types they are composed of. =head2 sys.std.Core.Type.Tuple The C type is the maximal type of all Muldis D tuple (nonscalar) types, and contains every tuple value that could possibly exist. The C type explicitly composes the C mixin type. A C is an unordered heterogeneous collection of 0..N named attributes (the count of attributes being its I), where all attribute names are mutually distinct, and each attribute may be of distinct types; the mapping of a tuple's attribute names and their declared data types is called the tuple's I. Its default value is the sole tuple value that has zero attributes. The cardinality of a I C type (if it has no type constraints other than those of its constituent attribute types) is equal to the product of the N-adic multiplication where there is an input to that multiplication for each attribute of the tuple and the value of the input is the cardinality of the declared type of the attribute; for a C subtype to be finite, all of its attribute types must be. Considering the low-level type system, C is just a proper subtype of C consisting of every C value whose first element is the C value C<2>. =head2 sys.std.Core.Type.DHTuple C is a proper subtype of C where every one of its attributes is restricted to be of just certain categories of data types, rather than allowing any data types at all; related to this restriction, any dh-tuple value is allowed to be stored in a global/persisting relational database but any other tuple value may only be used for transient data. The C type is the maximal type of all Muldis D dh-tuple (dh-nonscalar) types, and contains every dh-tuple value that could possibly exist. Its default value is the same as that of C and matters of its cardinality are determined likewise. The only member value of C that has exactly zero attributes is also known by the special name C aka C, which serves as the default value of the 3 types C<[|DH]Tuple> and C. =head2 sys.std.Core.Type.Database C is a proper subtype of C where all of its attributes are each of dh-relation types or of database types (the leaves of this recursion are all dh-relation types); it is otherwise the same. The 2 system-defined user-data variables named C<[fed|nlx].data> are all of "just" the C type, or are of its proper subtypes. =head2 sys.std.Core.Type.Set.T C is a proper subtype of C, and it exists in order for the relation type C (and C and C) to be defined partly in terms of it. A C has 1 attribute, C (a C). Its default value a C of C. =head2 sys.std.Core.Type.DHSet.T C is the intersection type of C and C, and it exists in order for the dh-relation type C (and C, C) to be defined partly in terms of it. =head2 sys.std.Core.Type.Array.T C is a proper subtype of C, and it exists in order for the relation type C to be defined partly in terms of it. An C has 2 attributes, C (a C) and C (a C). Its default value has an C of zero and a C of C. =head2 sys.std.Core.Type.DHArray.T C is the intersection type of C and C, and it exists in order for the dh-relation type C to be defined partly in terms of it. =head2 sys.std.Core.Type.Bag.T C is a proper subtype of C, and it exists in order for the relation type C to be defined partly in terms of it. A C has 2 attributes, C (a C) and C (a C). Its default value has a C of C and a C of 1. =head2 sys.std.Core.Type.DHBag.T C is the intersection type of C and C, and it exists in order for the dh-relation type C to be defined partly in terms of it. =head2 sys.std.Core.Type.SPInterval An C (single-piece interval) is a C. The C type explicitly composes the C mixin type. It typically defines a single I/I in terms of 2 I values plus an indicator of whether either, both, or none of the endpoint values are included in the interval. It can also define an I/I, which is accomplished by using an infinity for either or both endpoint values. An C has these 4 attributes: =over =item C - C These are the interval endpoint values; C defines the I endpoint and C defines the I endpoint. The endpoint values conceptually must be of the same, totally-ordered type (typically one of C, C, C, C, etc), although strictly speaking they may be of any types at all; in the latter case, to actually make practical use of such intervals, an C function must explicitly be employed. =item C - C If C or C are C, then C or C I considered to be included within the interval, respectively; otherwise, it I considered to be included within the interval. If both endpoints are within the interval (the use case which Muldis D optimizes its syntax for), the interval is I; otherwise if both endpoints are not in the interval, the interval is I. =back The C type supports empty intervals (which include no values at all) at least as a matter of simplicity in that it doesn't place any restrictions on the combination of attribute values an C value may have, such as that C can't be before C. This liberal design is also necessary to support the general case where the relative order of the C and C values is situation-dependent on what C function is used with the interval; that function also determines what type's concept of order is being applied, and so it also determines whether or not a given interval is considered empty or not. With respect to each compatible C function, an C is considered empty iff at least one of the following is true: 1. Its C is greater than its C. 2. Its C is equal to its C I at least one of C or C is true. 3. Both C and C are true I C and C are consecutive values. And so, there are many distinct C values that are conceptually empty intervals, and the C function should not be used to test an C for being empty or not. The C type supports I/I or I intervals that are orthogonal to data type. This feature is implemented using the 2 special singleton types C<-Inf> and C. Iff C is C<-Inf> then the interval is left-unbounded; iff C is C then the interval is right-unbounded. An interval that is unbounded on both ends is the maximal interval, in that all Muldis D values are members of it, at least in the general context lacking any C function. The default value of C represents an empty interval where its C and C attributes are C and C<-Inf>, respectively, and its other 2 attributes are C. See also the C type, which is the canonical means that Muldis D provides of representing the result of set-unioning 2 C where the latter do not touch or overlap, and provides the single I empty interval value. =head2 sys.std.Core.Type.DHSPInterval C is a proper subtype of C where every one of its values is also a C. In general practice, all C values are C values, because their endpoints would all be C values. The default value of C is the same as that of C. =head2 sys.std.Core.Type.Relation The C type is the maximal type of all Muldis D relation (nonscalar) types, and contains every relation value that could possibly exist. The C type explicitly composes the C mixin type. A C is analogous to a set of 0..N tuples where all tuples have the same heading (the degrees match and all attribute names, and typically corresponding declared data types, match), but that a C data type still has its own corresponding heading (attribute names and declared data types) even when it consists of zero tuples. Its default value is the sole relation value that has zero tuples and zero attributes. The cardinality of a I C type (if it has no type constraints other than those of its constituent attribute types) is equal to 2 raised to the power of the cardinality of the I C type with the same heading. A relation data type can also have (unique) keys each defined over a subset of its attributes, which constrain its set of values relative to there being no explicit keys, but having the keys won't turn an infinite relation type into a finite one. Considering the low-level type system, C is just a proper subtype of C consisting of every C value whose first element is the C value C<3>. =head2 sys.std.Core.Type.DHRelation C is a proper subtype of C where every one of its attributes is restricted to be of just certain categories of data types, rather than allowing any data types at all; related to this restriction, any dh-relation value is allowed to be stored in a global/persisting relational database but any other relation value may only be used for transient data. The main difference from its supertype is that a dh-relation's dh-tuples' headings all have matching declared data types for corresponding attributes, while with relations they don't have to. The C type is the maximal type of all Muldis D dh-relation (dh-nonscalar) types, and contains every dh-relation value that could possibly exist. Its default value is the same as that of C and matters of its cardinality are determined likewise. The only member value of C that has exactly zero attributes and exactly zero tuples is also known by the special name C aka C, which serves as the default value of the 2 types C<[|DH]Relation>. The only member value of C that has exactly zero attributes and exactly one tuple is also known by the special name C aka C. Note that I also refers to these 2 values by the special shorthand names I and I, respectively. =head2 sys.std.Core.Type.Set C is a proper subtype of C that has 1 attribute, and its name is C; it can be of any declared type. The C type explicitly composes the C mixin type. A C subtype is normally used by any system-defined N-adic operators where the order of their argument elements or result is not significant, and that duplicate values are not significant. Its default value has zero tuples. Note that, for any given C subtype, C, where its C attribute has a declared type of C, the type C can be considered the I of the type C. =head2 sys.std.Core.Type.DHSet C is the intersection type of C and C. The cardinality of this type is infinite. =head2 sys.std.Core.Type.Maybe C is a proper subtype of C where all member values may have at most one element; that is, it is a unary C with a nullary key. Operators that work specifically with C subtypes can provide a syntactic shorthand for working with sparse data; so Muldis D has something which is conceptually close to SQL's nullable types without actually having 3-valued logic; it would probably be convenient for code that round-trips SQL by way of Muldis D to use the C type. Its default value has zero tuples. =head2 sys.std.Core.Type.DHMaybe C is the intersection type of C and C. The cardinality of this type is infinite. The only member value of C that has exactly zero elements is also known by the special name C, aka C, aka I, aka C<∅>, which serves as the default value of the 4 types C<[|DH]Maybe> and C<[|DH]Set>. The single C value, which is a relation with zero tuples and a single attribute named C, is Muldis D's answer to the SQL NULL and is intended to be used for the same purposes; that is, a special marker for missing or inapplicable information, that does not typically equal any normal/scalar value; however, in Muldis D, C I, and it I equal to itself. To be more specific, the SQL NULL is very limited in what it actually can do, and can not be used to say anything other than "this isn't a normal value", similar to what Perl's "undef" says; if you want to actually indicate a reason why we don't have a normal value when more than one reason could possibly apply in the context, then using simply C or SQL's NULL can't do it, and instead you'll have to use other normal values such as status flags to keep the appropriate metadata. =head2 sys.std.Core.Type.Just C is a proper subtype of C where all member values have exactly 1 element. Its default value's only tuple's only attribute has the value C. The C type consists of all of C's values except C. =head2 sys.std.Core.Type.DHJust C is the intersection type of C and C. Subtypes of C are also used to implement data-carrying database objects that are conceptually scalars rather than relations; for example, the current state of a sequence generator might typically be one. The cardinality of this type is infinite. =head2 sys.std.Core.Type.Array C is a proper subtype of C that has 2 attributes, and their names are C and C, where C is a unary primary key and its declared type is a C subtype (C can be non-unique and of any declared type). The C type explicitly composes the C mixin type. An C is considered dense, and all C values in one are numbered consecutively from 0 to 1 less than the count of tuples, like array indices in typical programming languages. An C subtype is normally used by any system-defined N-adic operators where the order of their argument elements or result is significant (and duplicate values are significant); specifically, C defines an explicit ordering for C. Its default value has zero tuples. The C type explicitly composes the C mixin type. =head2 sys.std.Core.Type.DHArray C is the intersection type of C and C. The cardinality of this type is infinite. =head2 sys.std.Core.Type.Bag C (or I) is a proper subtype of C that has 2 attributes, and their names are C and C, where C is a unary primary key (that can have any declared type) and C is a C subtype. The C type explicitly composes the C mixin type. A C subtype is normally used by any system-defined N-adic operators where the order of their argument elements or result is not significant, but that duplicate values are significant; specifically, C defines an explicit count of occurrences for C, also known as that value's I. Its default value has zero tuples. =head2 sys.std.Core.Type.DHBag C is the intersection type of C and C. The cardinality of this type is infinite. =head2 sys.std.Core.Type.MPInterval C (multi-piece interval) is a proper subtype of C that is defined directly partly in terms of the tuple type C, thereby sharing its I, but defines no further constraints of its own. The C type explicitly composes the C mixin type. It defines a single I, which is conceptually either a set of 0..N intervals or a single larger interval that had 0..N sub-intervals sliced out. An C is the canonical means that Muldis D provides of representing the result of set-unioning 2 C where the latter do not touch or overlap. Moreover, an C also empowers Muldis D to have a single I empty interval value, which is the only C with zero tuples; this value is also the default value of C. The cardinality of this type is infinite. =head2 sys.std.Core.Type.DHMPInterval C is the intersection type of C and C. The cardinality of this type is infinite. =head1 GENERIC EXTERNAL DATA TYPES =head2 sys.std.Core.Type.External An C is a reference within the Muldis D virtual machine to a value managed not by the Muldis D implementation but rather by a peer or host language in the wider program that includes the VM. All C values are treated as black boxes by Muldis D itself. The cardinality of this type is infinity. The default value of this type is implementation-defined. Considering the low-level type system, C is just a proper subtype of C consisting of every C value whose first element is the C value C<5>. =head1 SEE ALSO Go to L for the majority of distribution-internal references, and L for the majority of distribution-external references. =head1 AUTHOR Darren Duncan (C) =head1 LICENSE AND COPYRIGHT This file is part of the formal specification of the Muldis D language. Muldis D is Copyright © 2002-2011, Muldis Data Systems, Inc. See the LICENSE AND COPYRIGHT of L for details. =head1 TRADEMARK POLICY The TRADEMARK POLICY in L applies to this file too. =head1 ACKNOWLEDGEMENTS The ACKNOWLEDGEMENTS in L apply to this file too. =cut