numeric-prelude-0.4.2: An experimental alternative hierarchy of numeric type classes

Algebra.Field

Contents

Synopsis

# Class

class C a => C a where Source

Field again corresponds to a commutative ring. Division is partially defined and satisfies

```   not (isZero b)  ==>  (a * b) / b === a
not (isZero a)  ==>  a * recip a === one```

when it is defined. To safely call division, the program must take type-specific action; e.g., the following is appropriate in many cases:

```safeRecip :: (Integral a, Eq a, Field.C a) => a -> Maybe a
safeRecip x =
let (q,r) = one `divMod` x
in  toMaybe (isZero r) q```

Typical examples include rationals, the real numbers, and rational functions (ratios of polynomial functions). An instance should be typically declared only if most elements are invertible.

Actually, we have also used this type class for non-fields containing lots of units, e.g. residue classes with respect to non-primes and power series. So the restriction `not (isZero a)` must be better `isUnit a`.

Minimal definition: `recip` or (`/`)

Minimal complete definition

Methods

(/) :: a -> a -> a infixl 7 Source

recip :: a -> a Source

(^-) :: a -> Integer -> a infixr 8 Source

Instances

 C Double C Float C T C T C T Integral a => C (Ratio a) RealFloat a => C (Complex a) (Ord a, C a) => C (T a) C a => C (T a) C a => C (T a) C a => C (T a) C a => C (T a) (Eq a, C a) => C (T a) Fractional a => C (T a) (C a, C a) => C (T a) (C a, C a) => C (T a) C a => C (T a) (C a, C a) => C (T a) C a => C (T a) C a => C (T a) C a => C (T a) (IsScalar u, C a) => C (T u a) C v => C (T a v) (Ord i, C a) => C (T i a) C v => C (T a v)

fromRational :: C a => Rational -> a Source

Needed to work around shortcomings in GHC.

# Properties

propDivision :: (Eq a, C a, C a) => a -> a -> Property Source

the restriction on the divisor should be `isUnit a` instead of `not (isZero a)`

propReciprocal :: (Eq a, C a, C a) => a -> Property Source