next up previous contents index
Next: Numbers Up: Basic data types and Previous: Maximal and minimal types,

Equality, ordering, and hashing

In comparable.cecil:


abstract object comparable[T <= comparable[T]]; 
extend type comparable[`T] subtypes comparable[`S <= T]; 
signature =(x1:`T <= comparable[T], x2:`T <= comparable[T]):bool;
- equal (abstract) values? 
method !=(x1@:`T <= comparable[T], x2@:`T <= comparable[T]):bool;
- not

=

  Comparable objects can be tested for equality. This equality should be an abstract notion of equality which compares two abstract values, as appropriate to the kind of data types being compared. It is not a low-level representation equality such as ==, which, like Lisp's eq, tests ``pointer equality.'' By default, operations that compare elements use = rather than ==, unless the operation's name includes identity_.


abstract object partially_ordered[T <= partially_ordered[T]] 
isa comparable[T];
extend type partially_ordered[`T] subtypes partially_ordered[`S <= T]; 
signature <(x1:`T <= partially_ordered[T],
x2:`T <= partially_ordered[T]):bool;
- x1 ordered below x2?
method <=(x1@:`T <= partially_ordered[T],
x2@:`T <= partially_ordered[T]):bool;
-

< or

=

method > (x1@:`T <= partially_ordered[T],
x2@:`T <= partially_ordered[T]):bool;
- x2

< x1?

method >=(x1@:`T <= partially_ordered[T],
x2@:`T <= partially_ordered[T]):bool;
-

> or

=

     Partially ordered objects are comparable objects that also can be compared for being less than one another, and other combinations. Since they form only a partial order, not(a < b) does not imply a >= b.


abstract object ordered[T <= ordered[T]] isa partially_ordered[T]; 
extend type ordered[`T] subtypes ordered[`S <= T]; 
method <=(x1@:`T <= ordered[T], x2@:`T <= ordered[T]):bool;
method >=(x1@:`T <= ordered[T], x2@:`T <= ordered[T]):bool;
method min (x1:`T <= ordered[T], x2:`T <= ordered[T]):T; 
method max (x1:`T <= ordered[T], x2:`T <= ordered[T]):T; 
method compare(x1@:`T <= ordered[T], x2@:`T <= ordered[T], 
if_less:&():`S, if_equal:&():`S, if_greater:&():`S
):S;
abstract object ordered_using_compare[T <= ordered[T]] isa ordered[T]; 
extend type ordered_using_compare[`T] subtypes ordered_using_compare[`S<=T]; 
method =(x1@:`T <= ordered_using_compare[T], 
x2@:`T <= ordered_using_compare[T]):bool;
method <(x1@:`T <= ordered_using_compare[T],
x2@:`T <= ordered_using_compare[T]):bool;
method compare(x1@:`T <= ordered_using_compare[T], 
x2@:`T <= ordered_using_compare[T],
if_less:&():`S, if_equal:&():`S, if_greater:&():`S
):S;
    Ordered objects refine partially-ordered objects by imposing a total order, i.e., not(a < b) does imply a >= b. The min and max functions are defined for all ordered objects. The compare function implements a three-way comparison, invoking one of its argument closures depending on how the first argument compares to its second argument. By default, concrete subclasses provide implementations of = and <, and compare is provided by default in terms of those primitives. Alternatively, a concrete subclass can inherit from ordered_using_compare, which assumes the subclass will provide an implementation of compare and defines = and < in terms of it.


abstract object hashable[T <= hashable[T]] isa comparable[T]; 
extend type hashable[`T] subtypes hashable[`S <= T]; 
signature hash(hashable[`T], range:int):int; 
A hashable object is a comparable (equality-testable) object that also supports a hash function. hash(x, r) returns an integer in the range [0..r-1], subject to the constraint that if a = b, then hash(a, r) = hash(b, r).


abstract object ordered_hashable[T <= ordered_hashable[T]] isa ordered[T], 
hashable[T];
extend type ordered_hashable[`T] subtypes ordered_hashable[`S <= T]; 
An ordered_hashable object is both hashable and ordered.


next up previous contents index
Next: Numbers Up: Basic data types and Previous: Maximal and minimal types,

The Cecil project