"Abstraction of numeric types with the usual binary 
 operations:
 
 - addition, `x + y`, 
 - subtraction, `x - y`, 
 - multiplication, `x * y`, and 
 - division, `x / y`, along with 
 - additive inverse `-x`.
 
 A concrete class which implements this interface should be
 a mathematical _ring_. That is:
 
 - both addition, `+`, and multiplication, `*`, should be
   associative and commutative,
 - there should be additive and multiplicative identities,
   denoted `0` and `1` respectively, satisfying `x+0 == x`
   and `x*1 == x`,
 - every instance `x` should have an additive inverse `-x`, 
   satisfying `x + -x == 0`, and
 - multiplication should distribute over addition, 
   satisfying `x*(y+z) == x*y + x*z`.
 
 It is preferred, but not required, that the class be a
 mathematical _field_. That is, in addition to the above:
 
 - every instance `x` such that `x!=0` should have a 
   multiplicative inverse `1/x`, satisfying `x * 1/x == 1`. 
 
 For numeric types which are not fields, for example, 
 [[Integer]], there is still a division operation, which is
 understood to produce a [[remainder|Integral.remainder]].
 The division operation should satisfy:
 
 - `x*y / y == x`
 
 for any instance `y` other than `0`.
 
 For numeric types which _are_ fields, division never
 produces a remainder, and division should additionally 
 satisfy:
 
 - `x/y * y == x`
 
 for any instance `y` other than `0`.
 
 Some numeric types, for example complex numbers, do not 
 have a [[total order|Comparable]]. Numeric types with a 
 total order also satisfy [[Number]]."
see (`interface Number`)
by ("Gavin")
tagged("Numbers")
shared interface Numeric<Other> of Other
        satisfies Invertible<Other>
        given Other satisfies Numeric<Other> {
    
    "The product of this number and the given number."
    shared formal Other times(Other other);
    
    "The quotient obtained by dividing this number by the 
     given number. For integral numeric types, this 
     operation results in a 
     [[remainder|Integral.remainder]].
     
     When the given number is `0`, the additive identity,
     the behavior depends on the numeric type:
     
     - For some numeric types, including [[Integer]], 
       division by `0` results in an exception.
     - For others, including [[Float]], it results in a 
       special value of the type, for example, [[infinity]]."
    see (`function Integral.remainder`, 
         `value infinity`)
    shared formal Other divided(Other other);
    
}