Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell98 |
- class C a => C a where
- sqr :: C a => a -> a
- product :: C a => [a] -> a
- product1 :: C a => [a] -> a
- scalarProduct :: C a => [a] -> [a] -> a
- propAssociative :: (Eq a, C a) => a -> a -> a -> Bool
- propLeftDistributive :: (Eq a, C a) => a -> a -> a -> Bool
- propRightDistributive :: (Eq a, C a) => a -> a -> a -> Bool
- propLeftIdentity :: (Eq a, C a) => a -> Bool
- propRightIdentity :: (Eq a, C a) => a -> Bool
- propPowerCascade :: (Eq a, C a) => a -> Integer -> Integer -> Property
- propPowerProduct :: (Eq a, C a) => a -> Integer -> Integer -> Property
- propPowerDistributive :: (Eq a, C a) => Integer -> a -> a -> Property
- propCommutative :: (Eq a, C a) => a -> a -> Bool
Class
Ring encapsulates the mathematical structure of a (not necessarily commutative) ring, with the laws
a * (b * c) === (a * b) * c one * a === a a * one === a a * (b + c) === a * b + a * c
Typical examples include integers, polynomials, matrices, and quaternions.
Minimal definition: *
, (one
or fromInteger
)
(*), (one | fromInteger)
(*) :: a -> a -> a infixl 7 Source
fromInteger :: Integer -> a Source
(^) :: a -> Integer -> a infixr 8 Source
The exponent has fixed type Integer
in order
to avoid an arbitrarily limitted range of exponents,
but to reduce the need for the compiler to guess the type (default type).
In practice the exponent is most oftenly fixed, and is most oftenly 2
.
Fixed exponents can be optimized away and
thus the expensive computation of Integer
s doesn't matter.
The previous solution used a C
constrained type
and the exponent was converted to Integer before computation.
So the current solution is not less efficient.
A variant of ^
with more flexibility is provided by ringPower
.
C Double | |
C Float | |
C Int | |
C Int8 | |
C Int16 | |
C Int32 | |
C Int64 | |
C Integer | |
C Word | |
C Word8 | |
C Word16 | |
C Word32 | |
C Word64 | |
C T | |
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 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) | |
(Eq a, C a) => C (T a) | |
Num a => C (T 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) | |
C a => C (T a) | |
C a => C (T a) | |
(C a, C a) => C (T a) | |
(Ord a, C a, C b) => C (T a b) | |
(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) |
Complex functions
scalarProduct :: C a => [a] -> [a] -> a Source
Properties
propAssociative :: (Eq a, C a) => a -> a -> a -> Bool Source
propLeftDistributive :: (Eq a, C a) => a -> a -> a -> Bool Source
propRightDistributive :: (Eq a, C a) => a -> a -> a -> Bool Source
propLeftIdentity :: (Eq a, C a) => a -> Bool Source
propRightIdentity :: (Eq a, C a) => a -> Bool Source