On 12/21/2015 05:33 PM, John Rose wrote:

Two events like that certainly call for generalization.
Algebraists will be eager to suggest other any-fied relations,
so we want to support open-ended extension mechanisms.
This is one reason value types are envisioned to interoperate
with interfaces.


I'm not sure about generalization. There's only the beginnings
of academic work on static analysis and validation of functional
properties (like those below pasted from something else I had around).
In the mean time, probably the best we could do is add annotations
(like @Symmetric) that would have to be trusted in order to
be effective. Or, nearer term, focus only on equals and compareTo.

for function f, predicate p, and valid arguments a, b, c:

Idempotent:      f(a) == f(a)
Deterministic:   if (a == b) then f(a) == f(b)
Injective:       if (a != b) then f(a) != f(b)
Commutative:     f(a, b) == f(b, a)
Associative:     f(f(a, b), c) == f(a, f(b, c))
Monotonic:       if (a <= b) then f(a) <= f(b)
Reflexive:       p(a, a)
Irreflexive:     !p(a, a)
Symmetric:       if (a == b) then p(a, b) == p(b, a)
Antisymmetric:   if (a != b) then p(a, b) != p(b, a)
Transitive:      if (p(a, b) and p(b, c)) then p(a, c)

-Doug

Reply via email to