The domain interface
Existing types may add the interpretation of being a domain by implementing the domain interface. They gain the ability to interact with other domains.
The in function
A domain is a set of elements that is possibly continuous. Continuous sets are defined mathematically, not by an exhaustive list of their elements. In practice membership of the set is defined by the implementation of in. The function call in(x, domain) evaluates to true if the domain contains an element y such that y == x.
Incompatible element types. In principle, the function in(x, domain) should not throw an exception even if the types seem mathematically nonsensical. In that case, the correct return value is false. This mimicks the behaviour of in for finite sets in Julia:
julia> in(rand(3,3), 1:3)
falseIndeed, a 3x3 matrix is not equal to any of the numbers 1, 2 or 3.
The domaineltype function
The defining mathematical condition of a continuous set might be satisfied by variables of different types. Still, the interface defines the domaineltype of a domain. It is a valid type for elements of the set.
Functions that generate elements of the domain should generate elements of that type. As a consequence, for finite sets such as an AbstractArray or AbstractSet, the domaineltype agrees with the eltype of that set. For intervals on the real line, the domaineltype might be Float64. When there is no clear candidate the domaineltype might simply be Any.
Minimal formal interface
The domain interface is formally summarised in the following table:
| Required methods | Brief description | |
|---|---|---|
in(x, d) | Returns true when x is an element of the domain, false otherwise | |
DomainStyle(d) | Returns IsDomain() if d implements this interface | |
| Optional methods | Default definition | Brief description |
domaineltype(d) | eltype(d) | Returns a valid type for elements of the domain |
Several extensions of this minimal interface are defined in the DomainSets package.
The Domain supertype and DomainStyle trait
Domains in this package inherit from the abstract type Domain{T}. It is the supertype of continuous sets with domaineltype equal to T.
The package also defines the trait DomainStyle. Any type can declare to implement the domain interface by defining
DomainSets.DomainStyle(d::MyDomain) = IsDomain()Objects of type Number, AbstractArray and AbstractSet are declared to be domains in this package.