Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Numeric classes.
Synopsis
- class Additive a where
- sum :: (Additive a, Foldable f) => f a -> a
- accsum :: (Additive a, Traversable f) => f a -> f a
- class Additive a => Subtractive a where
- class Multiplicative a where
- product :: (Multiplicative a, Foldable f) => f a -> a
- accproduct :: (Multiplicative a, Traversable f) => f a -> f a
- class Multiplicative a => Divisive a where
- class (Additive a, Multiplicative a) => Distributive a
- class (Distributive a, Subtractive a) => Ring a
- class Distributive a => StarSemiring a where
- class (StarSemiring a, Idempotent a) => KleeneAlgebra a
- class Distributive a => InvolutiveRing a where
- adj :: a -> a
- two :: (Multiplicative a, Additive a) => a
- class (Distributive a, Subtractive a, Divisive a) => Field a
- class Field a => ExpField a where
- class (Field a, Multiplicative b, Additive b) => QuotientField a b where
- properFraction :: a -> (b, a)
- round :: a -> b
- ceiling :: a -> b
- floor :: a -> b
- truncate :: a -> b
- class Field a => TrigField a where
- infinity :: Field a => a
- negInfinity :: Field a => a
- nan :: Field a => a
- half :: Field a => a
- class Eq a => JoinSemiLattice a where
- (\/) :: a -> a -> a
- joinLeq :: JoinSemiLattice a => a -> a -> Bool
- (<\) :: JoinSemiLattice a => a -> a -> Bool
- class Eq a => MeetSemiLattice a where
- (/\) :: a -> a -> a
- meetLeq :: MeetSemiLattice a => a -> a -> Bool
- (</) :: MeetSemiLattice a => a -> a -> Bool
- class JoinSemiLattice a => BoundedJoinSemiLattice a where
- bottom :: a
- class MeetSemiLattice a => BoundedMeetSemiLattice a where
- top :: a
- class Additive a => AdditiveAction m a | m -> a where
- (.+) :: a -> m -> m
- (+.) :: AdditiveAction m a => m -> a -> m
- class Subtractive a => SubtractiveAction m a | m -> a where
- (.-) :: a -> m -> m
- (-.) :: (AdditiveAction m a, Subtractive a) => m -> a -> m
- class Multiplicative a => MultiplicativeAction m a | m -> a where
- (.*) :: a -> m -> m
- (*.) :: MultiplicativeAction m a => m -> a -> m
- class Divisive a => DivisiveAction m a | m -> a where
- (./) :: a -> m -> m
- (/.) :: (MultiplicativeAction m a, Divisive a) => m -> a -> m
- class (Distributive a, MultiplicativeAction m a) => Module m a
- class (Additive a, Multiplicative a) => Signed a where
- class (Additive a, Multiplicative b, Additive b) => Norm a b | a -> b where
- distance :: (Norm a b, Subtractive a) => a -> a -> b
- class (Additive coord, Multiplicative coord, Additive dir, Multiplicative dir) => Direction coord dir | coord -> dir where
- data Polar mag dir = Polar {}
- polar :: (Norm coord mag, Direction coord dir) => coord -> Polar mag dir
- coord :: (MultiplicativeAction coord mag, Direction coord dir) => Polar mag dir -> coord
- class (Eq a, Additive a) => Epsilon a where
- epsilon :: a
- nearZero :: a -> Bool
- aboutEqual :: a -> a -> Bool
- (~=) :: Epsilon a => a -> a -> Bool
- data Complex a = !a :+ !a
- realPart :: Complex a -> a
- imagPart :: Complex a -> a
- class Distributive a => Integral a where
- class ToIntegral a b where
- toIntegral :: a -> b
- class FromIntegral a b where
- fromIntegral :: b -> a
- class FromInteger a where
- fromInteger :: Integer -> a
- even :: (Eq a, Integral a) => a -> Bool
- odd :: (Eq a, Integral a) => a -> Bool
- (^^) :: (Ord b, Divisive a, Subtractive b, Integral b) => a -> b -> a
- (^) :: Divisive a => a -> Int -> a
- data Ratio a = !a :% !a
- type Rational = Ratio Integer
- class ToRatio a b where
- class FromRatio a b where
- class FromRational a where
- fromRational :: Rational -> a
- reduce :: (Eq a, Subtractive a, Signed a, Integral a) => a -> a -> Ratio a
- gcd :: (Eq a, Signed a, Integral a) => a -> a -> a
- newtype NumHaskException = NumHaskException {}
- throw :: forall (r :: RuntimeRep) (a :: TYPE r) e. Exception e => e -> a
Usage
>>>
:set -XRebindableSyntax
>>>
import NumHask.Prelude
>>>
1+1
2
Overview
numhask is largely a set of classes that can replace the Num
class and it's descendents.
Principles that have guided design include:
- balanced class density. The numeric heirarchy begins with addition and multiplication, choosing not to build from a Magma base. Whilst not being as principled as other approaches, this circumvents the instance explosion problems of Haskell whilst maintaining clarity of class purpose.
- operator-first. In most cases, a class exists to define useful operators.
The exceptions are
Distributive
,Ring
andField
, which are collections of operators representing major teleological fault lines. - lawful. Most classes have laws associated with them that serve to relate class operators together in a meaningful way.
- low-impact. The library attempts to fit in with the rest of the Haskell ecosystem.
It provides instances for common numbers:
Int
,Integer
,Double
,Float
and the Word classes. It avoids name (or idea) clashes with other popular libraries and adopts conventions in the current prelude where they make sense. - proof-of-concept. The library may be below industrial-strength depending on a definition of this term. At the same time, correspondence around improving the library is most welcome.
The class heirarchy looks somewhat like this:
Prelude Mappings
Num
is a very old part of haskell, and is virtually unchanged since it's specification in
haskell98.
A deconstruction of Num
and mapping to numhask.
-- | Basic numeric class. class Num a where {-# MINIMAL (+), (*), abs, signum, fromInteger, (negate | (-)) #-} (+), (-), (*) :: a -> a -> a -- | Unary negation. negate :: a -> a
(+)
is an operator of the Additive
class
(-)
& negate
are functions in the Subtractive
class, and
(*)
is an operator of the Multiplicative
class.
zero
and one
are also introduced to the numeric heirarchy.
-- | Absolute value. abs :: a -> a -- | Sign of a number. -- The functions 'abs' and 'signum' should satisfy the law: -- -- > abs x * signum x == x -- -- For real numbers, the 'signum' is either @-1@ (negative), @0@ (zero) -- or @1@ (positive). signum :: a -> a
abs
is a function in the Signed
class.
The concept of an absolute value can also include situations where the domain and codomain
are different, and norm
as a function in the Norm
class is supplied
for these cases.
sign
replaces signum
, because signum is simply a naming crime.
basis
can also be seen as a generalisation of sign.
-- | Conversion from an 'Integer'. -- An integer literal represents the application of the function -- 'fromInteger' to the appropriate value of type 'Integer', -- so such literals have type @('Num' a) => a@. fromInteger :: Integer -> a
FromInteger
becomes its own class and FromIntegral
is introduced to polymorphise the covariant.
Mappings from other areas of prelude include:\
Integral
becomes Integral
and a polymorphic ToIntegral
is introduced.
Fractional
is roughly synonymous to Field
together with a polymorphic FromRatio
.
RealFrac
becomes the polymorphic QuotientField
Floating
is split into ExpField
and TrigField
RealFloat
is not attempted. Life is too short.
Extensions
RebindableSyntax is recommended for use with numhask.
As a replacement for the numerical classes, numhask clashes significantly with an
unqualified import of the Prelude
. Either numhask modules should be qualified,
or prelude turned off with the NoImplicitPrelude extension, or with RebindableSyntax,
which implies NoImplicitPrelude.
defaulting
Without RebindableSyntax, numeric literals default as follows:
>>>
:set -XNoRebindableSyntax
>>>
:t 1
1 :: Num a => a
>>>
:t 1.0
1.0 :: Fractional a => a
With RebindableSyntax (which also switches NoImplicitPrelude on) literal numbers change to the numhask types, FromInteger
and FromRational
:
>>>
:set -XRebindableSyntax
>>>
:t 1
1 :: FromInteger a => a
>>>
:t 1.0
1.0 :: FromRational a => a
>>>
1
1
>>>
1.0
1.0
RebindableSyntax is a tradeoff, however, and usage comes attached with other non-numeric changes that NumHask.Prelude attempts to counteract.
See haskell2010 Section 4.3.4 for the nuts and bolts to defaulting.
The effect of ExtendedDefaultRules
in ghci or switched on as an extension also need to be understood.
It can lead to unusual interactions with numerics and strange error messages at times because
it adds ()
and []
to the start of the type defaulting list.
Additive
class Additive a where Source #
or Addition
For practical reasons, we begin the class tree with Additive
. Starting with Associative
and Unital
, or using Semigroup
and Monoid
from base tends to confuse the interface once you start having to disinguish between (say) monoidal addition and monoidal multiplication.
\a -> zero + a == a
\a -> a + zero == a
\a b c -> (a + b) + c == a + (b + c)
\a b -> a + b == b + a
By convention, (+) is regarded as commutative, but this is not universal, and the introduction of another symbol which means non-commutative addition seems a bit dogmatic.
>>>
zero + 1
1
>>>
1 + 1
2
Instances
Additive Int16 Source # | |
Additive Int32 Source # | |
Additive Int64 Source # | |
Additive Int8 Source # | |
Additive Word16 Source # | |
Additive Word32 Source # | |
Additive Word64 Source # | |
Additive Word8 Source # | |
Additive Integer Source # | |
Additive Natural Source # | |
Additive Bool Source # | |
Additive Double Source # | |
Additive Float Source # | |
Additive Int Source # | |
Additive Word Source # | |
Additive a => Additive (Complex a) Source # | |
(Ord a, Signed a, Integral a, Ring a) => Additive (Ratio a) Source # | |
Additive b => Additive (a -> b) Source # | |
sum :: (Additive a, Foldable f) => f a -> a Source #
Compute the sum of a Foldable
.
>>>
sum [0..10]
55
accsum :: (Additive a, Traversable f) => f a -> f a Source #
Compute the accumulating sum of a Traversable
.
>>>
accsum [0..10]
[0,1,3,6,10,15,21,28,36,45,55]
class Additive a => Subtractive a where Source #
or Subtraction
\a -> a - a == zero
\a -> negate a == zero - a
\a -> negate a + a == zero
\a -> a + negate a == zero
>>>
negate 1
-1
>>>
1 - 2
-1
Nothing
Instances
Subtractive Int16 Source # | |
Subtractive Int32 Source # | |
Subtractive Int64 Source # | |
Subtractive Int8 Source # | |
Subtractive Word16 Source # | |
Subtractive Word32 Source # | |
Subtractive Word64 Source # | |
Subtractive Word8 Source # | |
Subtractive Integer Source # | |
Subtractive Natural Source # | |
Subtractive Double Source # | |
Subtractive Float Source # | |
Subtractive Int Source # | |
Subtractive Word Source # | |
Subtractive a => Subtractive (Complex a) Source # | |
(Ord a, Signed a, Integral a, Ring a) => Subtractive (Ratio a) Source # | |
Subtractive b => Subtractive (a -> b) Source # | |
Multiplicative
class Multiplicative a where Source #
For practical reasons, we begin the class tree with Additive
and Multiplicative
. Starting with Associative
and Unital
, or using Semigroup
and Monoid
from base tends to confuse the interface once you start having to disinguish between (say) monoidal addition and monoidal multiplication.
\a -> one * a == a
\a -> a * one == a
\a b c -> (a * b) * c == a * (b * c)
By convention, (*) is regarded as not necessarily commutative, but this is not universal, and the introduction of another symbol which means commutative multiplication seems a bit dogmatic.
>>>
one * 2
2
>>>
2 * 3
6
Instances
product :: (Multiplicative a, Foldable f) => f a -> a Source #
Compute the product of a Foldable
.
>>>
product [1..5]
120
accproduct :: (Multiplicative a, Traversable f) => f a -> f a Source #
Compute the accumulating product of a Traversable
.
>>>
accproduct [1..5]
[1,2,6,24,120]
class Multiplicative a => Divisive a where Source #
or Division
Though unusual, the term Divisive usefully fits in with the grammer of other classes and avoids name clashes that occur with some popular libraries.
\(a :: Double) -> a / a ~= one || a == zero
\(a :: Double) -> recip a ~= one / a || a == zero
\(a :: Double) -> recip a * a ~= one || a == zero
\(a :: Double) -> a * recip a ~= one || a == zero
>>>
recip 2.0
0.5
>>>
1 / 2
0.5
Nothing
Ring
class (Additive a, Multiplicative a) => Distributive a Source #
\a b c -> a * (b + c) == a * b + a * c
\a b c -> (a + b) * c == a * c + b * c
\a -> zero * a == zero
\a -> a * zero == zero
The sneaking in of the Absorption laws here glosses over the possibility that the multiplicative zero element does not have to correspond with the additive unital zero.
Instances
class (Distributive a, Subtractive a) => Ring a Source #
A Ring is an abelian group under addition (Unital
, Associative
, Commutative
, Invertible
) and monoidal under multiplication (Unital
, Associative
), and where multiplication distributes over addition.
\a -> zero + a == a \a -> a + zero == a \a b c -> (a + b) + c == a + (b + c) \a b -> a + b == b + a \a -> a - a == zero \a -> negate a == zero - a \a -> negate a + a == zero \a -> a + negate a == zero \a -> one * a == a \a -> a * one == a \a b c -> (a * b) * c == a * (b * c) \a b c -> a * (b + c) == a * b + a * c \a b c -> (a + b) * c == a * c + b * c \a -> zero * a == zero \a -> a * zero == zero
Instances
(Distributive a, Subtractive a) => Ring a Source # | |
Defined in NumHask.Algebra.Ring |
class Distributive a => StarSemiring a where Source #
A StarSemiring is a semiring with an additional unary operator (star) satisfying:
\a -> star a == one + a * star a
Nothing
Instances
StarSemiring b => StarSemiring (a -> b) Source # | |
class (StarSemiring a, Idempotent a) => KleeneAlgebra a Source #
A Kleene Algebra is a Star Semiring with idempotent addition.
a * x + x = a ==> star a * x + x = x x * a + x = a ==> x * star a + x = x
Instances
KleeneAlgebra b => KleeneAlgebra (a -> b) Source # | |
Defined in NumHask.Algebra.Ring |
class Distributive a => InvolutiveRing a where Source #
Involutive Ring
adj (a + b) ==> adj a + adj b adj (a * b) ==> adj a * adj b adj one ==> one adj (adj a) ==> a
Note: elements for which adj a == a
are called "self-adjoint".
Nothing
Instances
two :: (Multiplicative a, Additive a) => a Source #
Field
class (Distributive a, Subtractive a, Divisive a) => Field a Source #
A Field is a set on which addition, subtraction, multiplication, and division are defined. It is also assumed that multiplication is distributive over addition.
A summary of the rules inherited from super-classes of Field:
zero + a == a a + zero == a ((a + b) + c) (a + (b + c)) a + b == b + a a - a == zero negate a == zero - a negate a + a == zero a + negate a == zero one * a == a a * one == a ((a * b) * c) == (a * (b * c)) (a * (b + c)) == (a * b + a * c) ((a + b) * c) == (a * c + b * c) a * zero == zero zero * a == zero a / a == one || a == zero recip a == one / a || a == zero recip a * a == one || a == zero a * recip a == one || a == zero
Instances
Field Double Source # | |
Defined in NumHask.Algebra.Field | |
Field Float Source # | |
Defined in NumHask.Algebra.Field | |
Field a => Field (Complex a) Source # | |
Defined in NumHask.Data.Complex | |
(Ord a, Signed a, Integral a, Ring a) => Field (Ratio a) Source # | |
Defined in NumHask.Data.Rational | |
Field b => Field (a -> b) Source # | |
Defined in NumHask.Algebra.Field |
class Field a => ExpField a where Source #
A hyperbolic field class
\a -> a < zero || (sqrt . (**2)) a == a
\a -> a < zero || (log . exp) a ~= a
\a b -> (b < zero) || a <= zero || a == 1 || abs (a ** logBase a b - b) < 10 * epsilon
logBase :: a -> a -> a Source #
log to the base of
>>>
logBase 2 8
2.9999999999999996
square root
>>>
sqrt 4
2.0
class (Field a, Multiplicative b, Additive b) => QuotientField a b where Source #
Conversion from a Field
to a Ring
\a -> a - one < floor a <= a <= ceiling a < a + one
(\a -> a - one < fromIntegral (floor a :: Int) && fromIntegral (floor a :: Int) <= a && a <= fromIntegral (ceiling a :: Int) && fromIntegral (ceiling a :: Int) <= a + one) :: Double -> Bool
\a -> (round a :: Int) ~= (floor (a + half) :: Int)
properFraction :: a -> (b, a) Source #
round to the nearest integral
Exact ties are managed by rounding down ties if the whole component is even.
>>>
round (1.5 :: Double) :: Int
2
>>>
round (2.5 :: Double) :: Int
2
supply the next upper whole component
>>>
ceiling (1.001 :: Double) :: Int
2
supply the previous lower whole component
>>>
floor (1.001 :: Double) :: Int
1
default floor :: (Ord a, Subtractive b) => a -> b Source #
supply the whole component closest to zero
>>>
floor (-1.001 :: Double) :: Int
-2
>>>
truncate (-1.001 :: Double) :: Int
-1
Instances
QuotientField Double Integer Source # | |
QuotientField Double Int Source # | |
QuotientField Float Integer Source # | |
QuotientField Float Int Source # | |
(Ord a, Ord b, Signed a, Integral a, Ring a, Signed b, Subtractive b, Integral b, FromIntegral b a) => QuotientField (Ratio a) b Source # | |
QuotientField b c => QuotientField (a -> b) (a -> c) Source # | |
class Field a => TrigField a where Source #
Trigonometric Field
The list of laws is quite long: trigonometric identities
Instances
negInfinity :: Field a => a Source #
negative infinity
>>>
negInfinity + infinity
NaN
nan is defined as zero/zero
but note the (social) law:
>>>
nan == zero / zero
False
Lattice
class Eq a => JoinSemiLattice a where Source #
A algebraic structure with element joins: See Semilattice
Associativity: x \/ (y \/ z) == (x \/ y) \/ z Commutativity: x \/ y == y \/ x Idempotency: x \/ x == x
Instances
JoinSemiLattice Int16 Source # | |
JoinSemiLattice Int32 Source # | |
JoinSemiLattice Int64 Source # | |
JoinSemiLattice Int8 Source # | |
JoinSemiLattice Word16 Source # | |
JoinSemiLattice Word32 Source # | |
JoinSemiLattice Word64 Source # | |
JoinSemiLattice Word8 Source # | |
JoinSemiLattice Integer Source # | |
JoinSemiLattice Natural Source # | |
JoinSemiLattice Bool Source # | |
JoinSemiLattice Double Source # | |
JoinSemiLattice Float Source # | |
JoinSemiLattice Int Source # | |
JoinSemiLattice Word Source # | |
JoinSemiLattice a => JoinSemiLattice (Complex a) Source # | |
(Ord a, Integral a, Signed a, Subtractive a) => JoinSemiLattice (Ratio a) Source # | |
(Eq (a -> b), JoinSemiLattice b) => JoinSemiLattice (a -> b) Source # | |
Defined in NumHask.Algebra.Lattice |
joinLeq :: JoinSemiLattice a => a -> a -> Bool Source #
The partial ordering induced by the join-semilattice structure
(<\) :: JoinSemiLattice a => a -> a -> Bool infixr 6 Source #
The partial ordering induced by the join-semilattice structure
class Eq a => MeetSemiLattice a where Source #
A algebraic structure with element meets: See Semilattice
Associativity: x /\ (y /\ z) == (x /\ y) /\ z Commutativity: x /\ y == y /\ x Idempotency: x /\ x == x
Instances
MeetSemiLattice Int16 Source # | |
MeetSemiLattice Int32 Source # | |
MeetSemiLattice Int64 Source # | |
MeetSemiLattice Int8 Source # | |
MeetSemiLattice Word16 Source # | |
MeetSemiLattice Word32 Source # | |
MeetSemiLattice Word64 Source # | |
MeetSemiLattice Word8 Source # | |
MeetSemiLattice Integer Source # | |
MeetSemiLattice Natural Source # | |
MeetSemiLattice Bool Source # | |
MeetSemiLattice Double Source # | |
MeetSemiLattice Float Source # | |
MeetSemiLattice Int Source # | |
MeetSemiLattice Word Source # | |
MeetSemiLattice a => MeetSemiLattice (Complex a) Source # | |
(Ord a, Integral a, Signed a, Subtractive a) => MeetSemiLattice (Ratio a) Source # | |
(Eq (a -> b), MeetSemiLattice b) => MeetSemiLattice (a -> b) Source # | |
Defined in NumHask.Algebra.Lattice |
meetLeq :: MeetSemiLattice a => a -> a -> Bool Source #
The partial ordering induced by the meet-semilattice structure
(</) :: MeetSemiLattice a => a -> a -> Bool infixr 6 Source #
The partial ordering induced by the meet-semilattice structure
class JoinSemiLattice a => BoundedJoinSemiLattice a where Source #
Instances
class MeetSemiLattice a => BoundedMeetSemiLattice a where Source #
Instances
Module
class Additive a => AdditiveAction m a | m -> a where Source #
Additive Action
(+.) :: AdditiveAction m a => m -> a -> m infixl 6 Source #
flipped additive action
(+.) == flip (.+)
class Subtractive a => SubtractiveAction m a | m -> a where Source #
Subtractive Action
(-.) :: (AdditiveAction m a, Subtractive a) => m -> a -> m infixl 6 Source #
right scalar subtraction
(-.) == (+.) . negate
class Multiplicative a => MultiplicativeAction m a | m -> a where Source #
Multiplicative Action
(*.) :: MultiplicativeAction m a => m -> a -> m infixl 7 Source #
flipped multiplicative action
(*.) == flip (.*)
class Divisive a => DivisiveAction m a | m -> a where Source #
Divisive Action
(/.) :: (MultiplicativeAction m a, Divisive a) => m -> a -> m Source #
right scalar division
(/.) == (*.) . recip
class (Distributive a, MultiplicativeAction m a) => Module m a Source #
A Module
a .* one == a (a + b) .* c == (a .* c) + (b .* c) c *. (a + b) == (c *. a) + (c *. b) a .* zero == zero a .* b == b *. a
Metric
class (Additive a, Multiplicative a) => Signed a where Source #
signum
from base is not an operator name in numhask and is replaced by sign
. Compare with Norm
where there is a change in codomain.
\a -> abs a * sign a ~= a
abs zero == zero, so any value for sign zero is ok. We choose lawful neutral:
>>>
sign zero == zero
True
>>>
abs (-1)
1
>>>
sign (-1)
-1
Instances
Signed Int16 Source # | |
Signed Int32 Source # | |
Signed Int64 Source # | |
Signed Int8 Source # | |
Signed Word16 Source # | |
Signed Word32 Source # | |
Signed Word64 Source # | |
Signed Word8 Source # | |
Signed Integer Source # | |
Signed Natural Source # | |
Signed Double Source # | |
Signed Float Source # | |
Signed Int Source # | |
Signed Word Source # | |
(Ord a, Signed a, Integral a, Ring a) => Signed (Ratio a) Source # | |
class (Additive a, Multiplicative b, Additive b) => Norm a b | a -> b where Source #
Norm is a slight generalisation of Signed. The class has the same shape but allows the codomain to be different to the domain.
\a -> norm a >= zero \a -> norm zero == zero \a -> a == norm a .* basis a \a -> norm (basis a) == one
>>>
norm (-0.5 :: Double) :: Double
0.5
>>>
basis (-0.5 :: Double) :: Double
-1.0
Instances
Norm Int16 Int16 Source # | |
Norm Int32 Int32 Source # | |
Norm Int64 Int64 Source # | |
Norm Int8 Int8 Source # | |
Norm Word16 Word16 Source # | |
Norm Word32 Word32 Source # | |
Norm Word64 Word64 Source # | |
Norm Word8 Word8 Source # | |
Norm Integer Integer Source # | |
Norm Natural Natural Source # | |
Norm Double Double Source # | |
Norm Float Float Source # | |
Norm Int Int Source # | |
Norm Word Word Source # | |
ExpField a => Norm (Complex a) a Source # | A euclidean-style norm is strong convention for Complex. |
(Ord a, Signed a, Integral a, Ring a) => Norm (Ratio a) (Ratio a) Source # | |
distance :: (Norm a b, Subtractive a) => a -> a -> b Source #
Distance, which combines the Subtractive notion of difference, with Norm.
distance a b >= zero distance a a == zero distance a b .* basis (a - b) == a - b
class (Additive coord, Multiplicative coord, Additive dir, Multiplicative dir) => Direction coord dir | coord -> dir where Source #
Convert between a "co-ordinated" or "higher-kinded" number and representations of an angle. Typically thought of as polar co-ordinate conversion.
ray . angle == basis norm (ray x) == one
Something that has a magnitude and a direction.
Instances
Generic (Polar mag dir) Source # | |
(Show mag, Show dir) => Show (Polar mag dir) Source # | |
(Eq mag, Eq dir) => Eq (Polar mag dir) Source # | |
type Rep (Polar mag dir) Source # | |
Defined in NumHask.Algebra.Metric type Rep (Polar mag dir) = D1 ('MetaData "Polar" "NumHask.Algebra.Metric" "numhask-0.10.1.1-5se1IUyAn3UALQnNUDpTp7" 'False) (C1 ('MetaCons "Polar" 'PrefixI 'True) (S1 ('MetaSel ('Just "magnitude") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 mag) :*: S1 ('MetaSel ('Just "direction") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 dir))) |
polar :: (Norm coord mag, Direction coord dir) => coord -> Polar mag dir Source #
Convert from a number to a Polar.
coord :: (MultiplicativeAction coord mag, Direction coord dir) => Polar mag dir -> coord Source #
Convert from a Polar to a (coordinated aka higher-kinded) number.
class (Eq a, Additive a) => Epsilon a where Source #
A small number, especially useful for approximate equality.
Nothing
nearZero :: a -> Bool Source #
are we near enough?
>>>
nearZero (epsilon :: Double)
True
aboutEqual :: a -> a -> Bool Source #
Approximate equality
>>>
aboutEqual zero (epsilon :: Double)
True
default aboutEqual :: Subtractive a => a -> a -> Bool Source #
Instances
Epsilon Int16 Source # | |
Epsilon Int32 Source # | |
Epsilon Int64 Source # | |
Epsilon Int8 Source # | |
Epsilon Word16 Source # | |
Epsilon Word32 Source # | |
Epsilon Word64 Source # | |
Epsilon Word8 Source # | |
Epsilon Integer Source # | |
Epsilon Double Source # | 1e-14 |
Epsilon Float Source # | 1e-6 |
Epsilon Int Source # | 0 |
Epsilon Word Source # | |
(Ord a, Signed a, Epsilon a, Subtractive a) => Epsilon (Complex a) Source # | |
(Ord a, Signed a, Integral a, Ring a, MeetSemiLattice a) => Epsilon (Ratio a) Source # | |
(~=) :: Epsilon a => a -> a -> Bool infixl 4 Source #
About equal operator.
>>>
(1.0 + epsilon) ~= (1.0 :: Double)
True
Complex
Complex numbers have real and imaginary parts.
The Foldable
and Traversable
instances traverse the real part first.
(:+) infix 6 | |
|
Instances
Integral
class Distributive a => Integral a where Source #
An Integral is anything that satisfies the law:
\a b -> b == zero || b * (a `div` b) + (a `mod` b) == a
>>>
3 `divMod` 2
(1,1)
>>>
(-3) `divMod` 2
(-2,1)
>>>
(-3) `quotRem` 2
(-1,-1)
div :: a -> a -> a infixl 7 Source #
mod :: a -> a -> a infixl 7 Source #
Instances
class ToIntegral a b where Source #
toIntegral is kept separate from Integral to help with compatability issues.
toIntegral a == a
toIntegral :: a -> b Source #
Instances
class FromIntegral a b where Source #
Polymorphic version of fromInteger
fromIntegral a == a
fromIntegral :: b -> a Source #
Instances
class FromInteger a where Source #
fromInteger
is special in two ways:
- numeric integral literals (like "42") are interpreted specifically as "fromInteger (42 :: GHC.Num.Integer)". The prelude version is used as default (or whatever fromInteger is in scope if RebindableSyntax is set).
- The default rules in haskell2010 specify that constraints on
fromInteger
need to be in a formC v
, where v is a Num or a subclass of Num.
So a type synonym of `type FromInteger a = FromIntegral a Integer` doesn't work well with type defaulting; hence the need for a separate class.
fromInteger :: Integer -> a Source #
Instances
(^) :: Divisive a => a -> Int -> a infixr 8 Source #
raise a number to an Int
power
Note: This differs from (^) found in prelude which is a partial function (it errors on negative integrals). This monomorphic version is provided to help reduce ambiguous type noise in common usages of this sign.
>>>
2 ^ 3
8.0
>>>
2 ^ (-2)
0.25
Rational
A rational number
!a :% !a |
Instances
class ToRatio a b where Source #
toRatio is equivalent to Real
in base, but is polymorphic in the Integral type.
>>>
toRatio (3.1415927 :: Float) :: Ratio Integer
13176795 :% 4194304
Instances
class FromRatio a b where Source #
Fractional
in base splits into fromRatio and Field
>>>
fromRatio (5 :% 2 :: Ratio Integer) :: Double
2.5
class FromRational a where Source #
fromRational is special in two ways:
- numeric decimal literals (like "53.66") are interpreted as exactly "fromRational (53.66 :: GHC.Real.Ratio Integer)". The prelude version, GHC.Real.fromRational is used as default (or whatever is in scope if RebindableSyntax is set).
- The default rules in haskell2010 specify that contraints on
fromRational
need to be in a formC v
, where v is a Num or a subclass of Num.
So a type synonym of `type FromRational a = FromRatio a Integer` doesn't work well with type defaulting; hence the need for a separate class.
fromRational :: Rational -> a Source #
Instances
FromRational Double Source # | |
Defined in NumHask.Data.Rational fromRational :: Rational -> Double Source # | |
FromRational Float Source # | |
Defined in NumHask.Data.Rational fromRational :: Rational -> Float Source # | |
FromRational (Ratio Integer) Source # | |
Defined in NumHask.Data.Rational |
reduce :: (Eq a, Subtractive a, Signed a, Integral a) => a -> a -> Ratio a Source #
reduce
normalises a ratio by dividing both numerator and denominator by
their greatest common divisor.
>>>
reduce 72 60
6 :% 5
\a b -> reduce a b == a :% b || b == zero
gcd :: (Eq a, Signed a, Integral a) => a -> a -> a Source #
is the non-negative factor of both gcd
x yx
and y
of which
every common factor of x
and y
is also a factor; for example
, gcd
4 2 = 2
, gcd
(-4) 6 = 2
= gcd
0 44
.
= gcd
0 00
.
(That is, the common divisor that is "greatest" in the divisibility
preordering.)
Note: Since for signed fixed-width integer types,
,
the result may be negative if one of the arguments is abs
minBound
< 0
(and
necessarily is if the other is minBound
0
or
) for such types.minBound
>>>
gcd 72 60
12
Exceptions
newtype NumHaskException Source #
A numhask exception.
Instances
Exception NumHaskException Source # | |
Defined in NumHask.Exception | |
Show NumHaskException Source # | |
Defined in NumHask.Exception showsPrec :: Int -> NumHaskException -> ShowS # show :: NumHaskException -> String # showList :: [NumHaskException] -> ShowS # |