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

Synopsis

Class

class C a where Source #

Additive a encapsulates the notion of a commutative group, specified by the following laws:

          a + b === b + a
(a + b) + c === a + (b + c)
zero + a === a
a + negate a === 0


Typical examples include integers, dollars, and vectors.

Minimal definition: +, zero, and (negate or '(-)')

Minimal complete definition

zero, (+), ((-) | negate)

Methods

zero :: a Source #

zero element of the vector space

(+), (-) :: a -> a -> a infixl 6 +, - Source #

negate :: a -> a Source #

inverse with respect to +

Instances

 Source # Methods Source # Methods Source # Methods(+) :: Int -> Int -> Int Source #(-) :: Int -> Int -> Int Source # Source # Methods(+) :: Int8 -> Int8 -> Int8 Source #(-) :: Int8 -> Int8 -> Int8 Source # Source # Methods Source # Methods Source # Methods Source # Methods Source # Methods(+) :: Word -> Word -> Word Source #(-) :: Word -> Word -> Word Source # Source # Methods Source # Methods Source # Methods Source # Methods Source # Methods(+) :: T -> T -> T Source #(-) :: T -> T -> T Source #negate :: T -> T Source # Source # Methods(+) :: T -> T -> T Source #(-) :: T -> T -> T Source #negate :: T -> T Source # Source # Methods(+) :: T -> T -> T Source #(-) :: T -> T -> T Source #negate :: T -> T Source # Source # Methods(+) :: T -> T -> T Source #(-) :: T -> T -> T Source #negate :: T -> T Source # C v => C [v] Source # The Additive instantiations treat lists as prefixes of infinite lists with zero filled tail. This interpretation is not always appropriate. The end of a list may just mean: End of available data. In this case the shortening zip semantics would be more appropriate. Methodszero :: [v] Source #(+) :: [v] -> [v] -> [v] Source #(-) :: [v] -> [v] -> [v] Source #negate :: [v] -> [v] Source # Integral a => C (Ratio a) Source # Methods(+) :: Ratio a -> Ratio a -> Ratio a Source #(-) :: Ratio a -> Ratio a -> Ratio a Source #negate :: Ratio a -> Ratio a Source # RealFloat a => C (Complex a) Source # Methods(+) :: Complex a -> Complex a -> Complex a Source #(-) :: Complex a -> Complex a -> Complex a Source #negate :: Complex a -> Complex a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # Num a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # (Eq a, C a) => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # (Eq a, C a) => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # (C a, C a) => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # (C a, C a, C a) => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C a => C (T a) Source # Methodszero :: T a Source #(+) :: T a -> T a -> T a Source #(-) :: T a -> T a -> T a Source #negate :: T a -> T a Source # C v => C (b -> v) Source # Methodszero :: b -> v Source #(+) :: (b -> v) -> (b -> v) -> b -> v Source #(-) :: (b -> v) -> (b -> v) -> b -> v Source #negate :: (b -> v) -> b -> v Source # (C v0, C v1) => C (v0, v1) Source # Methodszero :: (v0, v1) Source #(+) :: (v0, v1) -> (v0, v1) -> (v0, v1) Source #(-) :: (v0, v1) -> (v0, v1) -> (v0, v1) Source #negate :: (v0, v1) -> (v0, v1) Source # (Ord a, C b) => C (T a b) Source # Methodszero :: T a b Source #(+) :: T a b -> T a b -> T a b Source #(-) :: T a b -> T a b -> T a b Source #negate :: T a b -> T a b Source # C v => C (T a v) Source # Methodszero :: T a v Source #(+) :: T a v -> T a v -> T a v Source #(-) :: T a v -> T a v -> T a v Source #negate :: T a v -> T a v Source # (C u, C a) => C (T u a) Source # Methodszero :: T u a Source #(+) :: T u a -> T u a -> T u a Source #(-) :: T u a -> T u a -> T u a Source #negate :: T u a -> T u a Source # (Ord i, C a) => C (T i a) Source # Methodszero :: T i a Source #(+) :: T i a -> T i a -> T i a Source #(-) :: T i a -> T i a -> T i a Source #negate :: T i a -> T i a Source # C v => C (T a v) Source # Methodszero :: T a v Source #(+) :: T a v -> T a v -> T a v Source #(-) :: T a v -> T a v -> T a v Source #negate :: T a v -> T a v Source # (C v0, C v1, C v2) => C (v0, v1, v2) Source # Methodszero :: (v0, v1, v2) Source #(+) :: (v0, v1, v2) -> (v0, v1, v2) -> (v0, v1, v2) Source #(-) :: (v0, v1, v2) -> (v0, v1, v2) -> (v0, v1, v2) Source #negate :: (v0, v1, v2) -> (v0, v1, v2) Source #

zero :: C a => a Source #

zero element of the vector space

(+), (-) :: C a => a -> a -> a infixl 6 +, - Source #

(+), (-) :: C a => a -> a -> a infixl 6 -, + Source #

negate :: C a => a -> a Source #

inverse with respect to +

subtract :: C a => a -> a -> a Source #

subtract is (-) with swapped operand order. This is the operand order which will be needed in most cases of partial application.

Complex functions

sum :: C a => [a] -> a Source #

Sum up all elements of a list. An empty list yields zero.

This function is inappropriate for number types like Peano. Maybe we should make sum a method of Additive. This would also make lengthLeft and lengthRight superfluous.

sum1 :: C a => [a] -> a Source #

Sum up all elements of a non-empty list. This avoids including a zero which is useful for types where no universal zero is available. ToDo: Should have NonEmpty type.

sumNestedAssociative :: C a => [a] -> a Source #

Sum the operands in an order, such that the dependencies are minimized. Does this have a measurably effect on speed?

Requires associativity.

sumNestedCommutative :: C a => [a] -> a Source #

Instance definition helpers

elementAdd :: C x => (v -> x) -> T (v, v) x Source #

Instead of baking the add operation into the element function, we could use higher rank types and pass a generic uncurry (+) to the run function. We do not do so in order to stay Haskell 98 at least for parts of NumericPrelude.

elementSub :: C x => (v -> x) -> T (v, v) x Source #

elementNeg :: C x => (v -> x) -> T v x Source #

(<*>.+) :: C x => T (v, v) (x -> a) -> (v -> x) -> T (v, v) a infixl 4 Source #

addPair :: (Additive.C a, Additive.C b) => (a,b) -> (a,b) -> (a,b)
addPair = Elem.run2 $Elem.with (,) <*>.+ fst <*>.+ snd (<*>.-) :: C x => T (v, v) (x -> a) -> (v -> x) -> T (v, v) a infixl 4 Source # (<*>.-$) :: C x => T v (x -> a) -> (v -> x) -> T v a infixl 4 Source #

Instances for atomic types

propAssociative :: (Eq a, C a) => a -> a -> a -> Bool Source #

propCommutative :: (Eq a, C a) => a -> a -> Bool Source #

propIdentity :: (Eq a, C a) => a -> Bool Source #

propInverse :: (Eq a, C a) => a -> Bool Source #