Copyright | (C) 2014 Richard Eisenberg |
---|---|
License | BSD-style (see LICENSE) |
Maintainer | Richard Eisenberg (rae@cs.brynmawr.edu) |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
The units package is a framework for strongly-typed dimensional analysis. This haddock documentation is generally not enough to be able to use this package effectively. Please see the readme at https://github.com/goldfirere/units/blob/master/README.md.
Some of the types below refer to declarations that are not exported and not documented here. This is because Haddock does not allow finely-tuned abstraction in documentation. (In particular, right-hand sides of type synonym declarations are always included.) If a symbol is not exported, you do not need to know anything about it to use this package.
Though it doesn't appear here, Count
is an instance of Num
, and
generally has all the numeric instances that Double
has.
This module exports definitions that lack unit-polymorphism. If you wish
to write more polymorphic code, see Poly
. If you wish
to use the numerical hierarchy from the vector-space
package, see
Vector
.
Synopsis
- numIn :: (ValidDLU dim DefaultLCSU unit, Fractional n) => Qu dim DefaultLCSU n -> unit -> n
- (#) :: (ValidDLU dim DefaultLCSU unit, Fractional n) => Qu dim DefaultLCSU n -> unit -> n
- quOf :: (ValidDLU dim DefaultLCSU unit, Fractional n) => n -> unit -> Qu dim DefaultLCSU n
- (%) :: (ValidDLU dim DefaultLCSU unit, Fractional n) => n -> unit -> Qu dim DefaultLCSU n
- type Count = MkQu_U Number
- data Z
- type family Elem (a :: k) (bs :: [k]) :: Constraint where ...
- type family Subset (as :: [k]) (bs :: [k]) :: Constraint where ...
- type family SetEqual (as :: [k]) (bs :: [k]) :: Constraint where ...
- type MFive = P MFour
- type MFour = P MThree
- type MThree = P MTwo
- type MTwo = P MOne
- type MOne = P Zero
- type Five = S Four
- type Four = S Three
- type Three = S Two
- type Two = S One
- type One = S Zero
- type family (a :: Z) #/ (b :: Z) :: Z where ...
- type family Negate (z :: Z) :: Z where ...
- type family (a :: Z) #* (b :: Z) :: Z where ...
- type family (a :: Z) #- (b :: Z) :: Z where ...
- type family (a :: Z) #+ (b :: Z) :: Z where ...
- type family Pred (z :: Z) :: Z where ...
- type family Succ (z :: Z) :: Z where ...
- sZero :: Sing Zero
- sOne :: Sing (S Zero)
- sTwo :: Sing (S (S Zero))
- sThree :: Sing (S (S (S Zero)))
- sFour :: Sing (S (S (S (S Zero))))
- sFive :: Sing (S (S (S (S (S Zero)))))
- sMOne :: Sing (P Zero)
- sMTwo :: Sing (P (P Zero))
- sMThree :: Sing (P (P (P Zero)))
- sMFour :: Sing (P (P (P (P Zero))))
- sMFive :: Sing (P (P (P (P (P Zero)))))
- sSucc :: Sing z -> Sing (Succ z)
- sPred :: Sing z -> Sing (Pred z)
- sNegate :: Sing z -> Sing (Negate z)
- pZero :: Sing Zero
- pOne :: Sing (S Zero)
- pTwo :: Sing (S (S Zero))
- pThree :: Sing (S (S (S Zero)))
- pFour :: Sing (S (S (S (S Zero))))
- pFive :: Sing (S (S (S (S (S Zero)))))
- pMOne :: Sing (P Zero)
- pMTwo :: Sing (P (P Zero))
- pMThree :: Sing (P (P (P Zero)))
- pMFour :: Sing (P (P (P (P Zero))))
- pMFive :: Sing (P (P (P (P (P Zero)))))
- pSucc :: Sing z -> Sing (Succ z)
- pPred :: Sing z -> Sing (Pred z)
- type family (dims :: [Factor *]) @/ (z :: Z) :: [Factor *] where ...
- type family (base :: [Factor *]) @* (power :: Z) :: [Factor *] where ...
- type family NegList (a :: [Factor *]) :: [Factor *] where ...
- type family NegDim (a :: Factor *) :: Factor * where ...
- type family (a :: [Factor *]) @- (b :: [Factor *]) :: [Factor *] where ...
- type family (a :: [Factor *]) @@- (b :: [Factor *]) :: [Factor *] where ...
- type family (a :: [Factor *]) @+ (b :: [Factor *]) :: [Factor *] where ...
- type family (a :: [Factor *]) @@+ (b :: [Factor *]) :: [Factor *] where ...
- type family Normalize (d :: [Factor *]) :: [Factor *] where ...
- type family (a :: [Factor *]) @~ (b :: [Factor *]) :: Constraint where ...
- type family Reorder' (scrut :: ([Factor *], Maybe (Factor *))) (t :: [Factor *]) :: [Factor *] where ...
- type family Reorder (a :: [Factor *]) (b :: [Factor *]) :: [Factor *] where ...
- type family Extract (s :: Factor *) (lst :: [Factor *]) :: ([Factor *], Maybe (Factor *)) where ...
- type family (a :: Factor *) $= (b :: Factor *) :: Bool where ...
- data Factor star = F star Z
- type family MkLCSU pairs where ...
- type family DefaultUnitOfDim (dim :: *) :: *
- type family LookupList (keys :: [Factor *]) (map :: LCSU *) :: [Factor *] where ...
- type family Lookup (dim :: *) (lcsu :: LCSU *) :: * where ...
- data LCSU star = DefaultLCSU
- class Dimension dim where
- type DimFactorsOf dim :: [Factor *]
- data Number = Number
- data Dimensionless = Dimensionless
- class Units units => UnitFactor (units :: [Factor *])
- type family BaseHasConvRatio unit where ...
- type family CanonicalUnit' (base_unit :: *) (unit :: *) :: * where ...
- type CanonicalUnit (unit :: *) = CanonicalUnit' (BaseUnit unit) unit
- type family IsCanonical (unit :: *) where ...
- type family DimOfUnitIsConsistent unit :: Constraint where ...
- class DimOfUnitIsConsistent unit => Unit unit where
- type BaseUnit unit :: *
- type DimOfUnit unit :: *
- type UnitFactorsOf unit :: [Factor *]
- conversionRatio :: unit -> Rational
- data Canonical
- type family (d :: *) %^ (z :: Z) :: *
- type family (d1 :: *) %/ (d2 :: *) :: *
- type family (d1 :: *) %* (d2 :: *) :: *
- type MkQu_ULN unit = Qu (DimFactorsOf (DimOfUnit unit))
- type MkQu_U unit = Qu (DimFactorsOf (DimOfUnit unit)) DefaultLCSU Double
- type MkQu_DLN dim = Qu (DimFactorsOf dim)
- type MkQu_D dim = Qu (DimFactorsOf dim) DefaultLCSU Double
- data Qu (a :: [Factor *]) (lcsu :: LCSU *) (n :: *)
- quantity :: n -> Qu '[] l n
- (|*|) :: Num n => Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
- (|/|) :: Fractional n => Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
- (|^) :: (NonNegative z, Num n) => Qu a l n -> Sing z -> Qu (a @* z) l n
- (|^^) :: Fractional n => Qu a l n -> Sing z -> Qu (a @* z) l n
- qNthRoot :: ((Zero < z) ~ True, Floating n) => Sing z -> Qu a l n -> Qu (a @/ z) l n
- qCompare :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Ordering
- (|<|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool
- (|>|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool
- (|<=|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool
- (|>=|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool
- (|==|) :: (d1 @~ d2, Eq n) => Qu d1 l n -> Qu d2 l n -> Bool
- (|/=|) :: (d1 @~ d2, Eq n) => Qu d1 l n -> Qu d2 l n -> Bool
- qApprox :: (d0 @~ d1, d0 @~ d2, Num n, Ord n) => Qu d0 l n -> Qu d1 l n -> Qu d2 l n -> Bool
- qNapprox :: (d0 @~ d1, d0 @~ d2, Num n, Ord n) => Qu d0 l n -> Qu d1 l n -> Qu d2 l n -> Bool
- (/|) :: Fractional n => n -> Qu b l n -> Qu (Normalize ('[] @- b)) l n
- qSq :: Num n => Qu a l n -> Qu (Normalize (a @+ a)) l n
- qCube :: Num n => Qu a l n -> Qu (Normalize (Normalize (a @+ a) @+ a)) l n
- qSqrt :: Floating n => Qu a l n -> Qu (a @/ Two) l n
- qCubeRoot :: Floating n => Qu a l n -> Qu (a @/ Three) l n
- defaultLCSU :: Qu dim DefaultLCSU n -> Qu dim DefaultLCSU n
- unity :: Num n => Qu '[] l n
- redim :: d @~ e => Qu d l n -> Qu e l n
- class UnitPrefix prefix where
- multiplier :: Fractional f => prefix -> f
- data prefix :@ unit = prefix :@ unit
- data unit :^ (power :: Z) = unit :^ (Sing power)
- data u1 :/ u2 = u1 :/ u2
- data u1 :* u2 = u1 :* u2
- type family DefaultConvertibleLCSU_U (unit :: *) (l :: LCSU *) :: Constraint where ...
- type family DefaultConvertibleLCSU_D (dim :: *) (l :: LCSU *) :: Constraint where ...
- type family CompatibleDim (lcsu :: LCSU *) (dim :: *) :: Constraint where ...
- type family CompatibleUnit (lcsu :: LCSU *) (unit :: *) :: Constraint where ...
- type family CanonicalUnitsOfFactors (fs :: [Factor *]) :: [*] where ...
- type family (units1 :: [Factor *]) *~ (units2 :: [Factor *]) :: Constraint where ...
- type family ConvertibleLCSUs_D (dim :: *) (l1 :: LCSU *) (l2 :: LCSU *) :: Constraint where ...
- type family ConvertibleLCSUs (dfactors :: [Factor *]) (l1 :: LCSU *) (l2 :: LCSU *) :: Constraint where ...
- type family ValidDL (dfactors :: [Factor *]) (lcsu :: LCSU *) :: Constraint where ...
- type family ValidDLU (dfactors :: [Factor *]) (lcsu :: LCSU *) (unit :: *) where ...
- type family UnitOfDimFactors (dims :: [Factor *]) (lcsu :: LCSU *) :: * where ...
- type family MultUnitFactors (facts :: [Factor *]) where ...
- type family MultDimFactors (facts :: [Factor *]) where ...
- showIn :: (ValidDLU dim lcsu unit, Fractional n, Show unit, Show n) => Qu dim lcsu n -> unit -> String
- convert :: forall d l1 l2 n. (ConvertibleLCSUs d l1 l2, Fractional n) => Qu d l1 n -> Qu d l2 n
- constant :: (d @~ e, ConvertibleLCSUs e DefaultLCSU l, Fractional n) => Qu d DefaultLCSU n -> Qu e l n
- zero :: Num n => Qu dimspec l n
- (|+|) :: (d1 @~ d2, Num n) => Qu d1 l n -> Qu d2 l n -> Qu d1 l n
- (|-|) :: (d1 @~ d2, Num n) => Qu d1 l n -> Qu d2 l n -> Qu d1 l n
- qSum :: (Foldable f, Num n) => f (Qu d l n) -> Qu d l n
- qNegate :: Num n => Qu d l n -> Qu d l n
- (*|) :: Num n => n -> Qu b l n -> Qu b l n
- (|*) :: Num n => Qu a l n -> n -> Qu a l n
- (|/) :: Fractional n => Qu a l n -> n -> Qu a l n
Operators working with a default LCSU
numIn :: (ValidDLU dim DefaultLCSU unit, Fractional n) => Qu dim DefaultLCSU n -> unit -> n Source #
Extracts a numerical value from a dimensioned quantity, expressed in the given unit. For example:
inMeters :: Length -> Double inMeters x = numIn x Meter
or
inMeters x = x # Meter
(#) :: (ValidDLU dim DefaultLCSU unit, Fractional n) => Qu dim DefaultLCSU n -> unit -> n infix 5 Source #
Infix synonym for numIn
quOf :: (ValidDLU dim DefaultLCSU unit, Fractional n) => n -> unit -> Qu dim DefaultLCSU n Source #
Creates a dimensioned quantity in the given unit. For example:
height :: Length height = quOf 2.0 Meter
or
height = 2.0 % Meter
(%) :: (ValidDLU dim DefaultLCSU unit, Fractional n) => n -> unit -> Qu dim DefaultLCSU n infixr 5 Source #
Infix synonym for quOf
type Count = MkQu_U Number Source #
The type of unitless dimensioned quantities.
This is an instance of Num
, though Haddock doesn't show it.
This assumes a default LCSU and an internal representation of Double
.
The rest of the units
package interface.
Though Haddock doesn't show it, the polymorphic versions of numIn
,
#
, quOf
, %
, and Count
are not re-exported.
The datatype for type-level integers.
Instances
Eq Z Source # | |
SEq Z => SEq Z Source # | |
PEq Z Source # | |
SDecide Z => SDecide Z Source # | |
SingKind Z Source # | |
SingI Zero Source # | |
Defined in Data.Metrology.Z | |
SingI n => SingI (S n :: Z) Source # | |
Defined in Data.Metrology.Z | |
SingI n => SingI (P n :: Z) Source # | |
Defined in Data.Metrology.Z | |
SuppressUnusedWarnings PSym0 Source # | |
Defined in Data.Metrology.Z suppressUnusedWarnings :: () # | |
SuppressUnusedWarnings SSym0 Source # | |
Defined in Data.Metrology.Z suppressUnusedWarnings :: () # | |
SingI PSym0 Source # | |
Defined in Data.Metrology.Z | |
SingI SSym0 Source # | |
Defined in Data.Metrology.Z | |
SingI (TyCon1 S) Source # | |
SingI (TyCon1 P) Source # | |
data Sing (a :: Z) Source # | |
type Demote Z Source # | |
Defined in Data.Metrology.Z | |
type (x :: Z) /= (y :: Z) Source # | |
type (a :: Z) == (b :: Z) Source # | |
Defined in Data.Metrology.Z | |
type Apply PSym0 (t6989586621679083879 :: Z) Source # | |
Defined in Data.Metrology.Z | |
type Apply SSym0 (t6989586621679083877 :: Z) Source # | |
Defined in Data.Metrology.Z |
type family Elem (a :: k) (bs :: [k]) :: Constraint where ... Source #
Is an element contained in a list?
Elem a (a ': bs) = (() :: Constraint) | |
Elem a (b ': bs) = a `Elem` bs |
type family Subset (as :: [k]) (bs :: [k]) :: Constraint where ... Source #
Is one list a subset of the other?
Subset '[] bs = (() :: Constraint) | |
Subset (a ': as) bs = (a `Elem` bs, as `Subset` bs) |
type family SetEqual (as :: [k]) (bs :: [k]) :: Constraint where ... Source #
Are two lists equal, when considered as sets?
This is the singleton value representing Zero
at the term level and
at the type level, simultaneously. Used for raising units to powers.
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pOne :: Sing (S Zero) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pTwo :: Sing (S (S Zero)) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pThree :: Sing (S (S (S Zero))) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pFour :: Sing (S (S (S (S Zero)))) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pFive :: Sing (S (S (S (S (S Zero))))) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pMOne :: Sing (P Zero) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pMTwo :: Sing (P (P Zero)) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pMThree :: Sing (P (P (P Zero))) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pMFour :: Sing (P (P (P (P Zero)))) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pMFive :: Sing (P (P (P (P (P Zero))))) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pSucc :: Sing z -> Sing (Succ z) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
pPred :: Sing z -> Sing (Pred z) Source #
Deprecated: The singleton prefix is changing from p
to s
. The p
versions will be removed in a future release.
type family (dims :: [Factor *]) @/ (z :: Z) :: [Factor *] where ... infixl 7 Source #
Division of the exponents in a dimension by a scalar
type family (base :: [Factor *]) @* (power :: Z) :: [Factor *] where ... infixl 7 Source #
Multiplication of the exponents in a dimension by a scalar
type family (a :: [Factor *]) @- (b :: [Factor *]) :: [Factor *] where ... infixl 6 Source #
Subtract exponents in two dimensions
type family (a :: [Factor *]) @@- (b :: [Factor *]) :: [Factor *] where ... infixl 6 Source #
Subtract exponents in two dimensions, assuming the lists are ordered similarly.
type family (a :: [Factor *]) @+ (b :: [Factor *]) :: [Factor *] where ... infixl 6 Source #
Adds corresponding exponents in two dimension, preserving order
type family (a :: [Factor *]) @@+ (b :: [Factor *]) :: [Factor *] where ... infixl 6 Source #
Adds corresponding exponents in two dimension, assuming the lists are ordered similarly.
type family Normalize (d :: [Factor *]) :: [Factor *] where ... Source #
Take a [Factor *]
and remove any Factor
s with an exponent of 0
type family (a :: [Factor *]) @~ (b :: [Factor *]) :: Constraint where ... infix 4 Source #
Check if two [Factor *]
s should be considered to be equal
type family Reorder' (scrut :: ([Factor *], Maybe (Factor *))) (t :: [Factor *]) :: [Factor *] where ... Source #
Helper function in Reorder
type family Reorder (a :: [Factor *]) (b :: [Factor *]) :: [Factor *] where ... Source #
Reorders a to be the in the same order as b, putting entries not in b at the end
Reorder [A 1, B 2] [B 5, A 2] ==> [B 2, A 1] Reorder [A 1, B 2, C 3] [C 2, A 8] ==> [C 3, A 1, B 2] Reorder [A 1, B 2] [B 4, C 1, A 9] ==> [B 2, A 1] Reorder x x ==> x Reorder x [] ==> x Reorder [] x ==> []
type family Extract (s :: Factor *) (lst :: [Factor *]) :: ([Factor *], Maybe (Factor *)) where ... Source #
(Extract s lst)
pulls the Factor that matches s out of lst, returning a
diminished list and, possibly, the extracted Factor.
Extract A [A, B, C] ==> ([B, C], Just A Extract F [A, B, C] ==> ([A, B, C], Nothing)
type family (a :: Factor *) $= (b :: Factor *) :: Bool where ... infix 4 Source #
Do these Factors represent the same dimension?
This will only be used at the kind level. It holds a dimension or unit with its exponent.
Instances
UnitFactor ([] :: [Factor Type]) Source # | |
Defined in Data.Metrology.Units canonicalConvRatioSpec :: Proxy [] -> Rational | |
Read n => Read (Qu ([] :: [Factor Type]) l n) Source # | |
Show n => Show (Qu ([] :: [Factor Type]) l n) Source # | |
(UnitFactor rest, Unit unit, SingI n) => UnitFactor (F unit n ': rest) Source # | |
Defined in Data.Metrology.Units canonicalConvRatioSpec :: Proxy (F unit n ': rest) -> Rational |
type family MkLCSU pairs where ... Source #
Make a local consistent set of units. The argument is a type-level list of tuple types, to be interpreted as an association list from dimensions to units. For example:
type MyLCSU = MkLCSU '[(Length, Foot), (Mass, Gram), (Time, Year)]
MkLCSU pairs = MkLCSU_ (UsePromotedTuples pairs) |
type family DefaultUnitOfDim (dim :: *) :: * Source #
Assign a default unit for a dimension. Necessary only when using default LCSUs.
Instances
type DefaultUnitOfDim Dimensionless Source # | |
Defined in Data.Metrology.Units | |
type DefaultUnitOfDim (d :^ z) Source # | |
Defined in Data.Metrology.Combinators | |
type DefaultUnitOfDim (d1 :/ d2) Source # | |
Defined in Data.Metrology.Combinators | |
type DefaultUnitOfDim (d1 :* d2) Source # | |
Defined in Data.Metrology.Combinators |
type family LookupList (keys :: [Factor *]) (map :: LCSU *) :: [Factor *] where ... Source #
LookupList '[] lcsu = '[] | |
LookupList (F dim z ': rest) lcsu = F (Lookup dim lcsu) z ': LookupList rest lcsu |
type family Lookup (dim :: *) (lcsu :: LCSU *) :: * where ... Source #
Lookup dim (MkLCSU_ ('(dim, unit) ': rest)) = unit | |
Lookup dim (MkLCSU_ ('(other, u) ': rest)) = Lookup dim (MkLCSU_ rest) | |
Lookup dim DefaultLCSU = DefaultUnitOfDim dim |
This class is used to mark abstract dimensions, such as Length
, or
Mass
.
type DimFactorsOf dim :: [Factor *] Source #
Retrieve a list of Factor
s representing the given dimension. Overriding
the default of this type family should not be necessary in user code.
Instances
Dimension Dimensionless Source # | |
Defined in Data.Metrology.Units type DimFactorsOf Dimensionless :: [Factor Type] Source # | |
Dimension dim => Dimension (dim :^ power) Source # | |
Defined in Data.Metrology.Combinators | |
(Dimension d1, Dimension d2) => Dimension (d1 :/ d2) Source # | |
Defined in Data.Metrology.Combinators | |
(Dimension d1, Dimension d2) => Dimension (d1 :* d2) Source # | |
Defined in Data.Metrology.Combinators |
The unit for unitless dimensioned quantities
Instances
Unit Number Source # | |
type BaseUnit Number Source # | |
Defined in Data.Metrology.Units | |
type DimOfUnit Number Source # | |
Defined in Data.Metrology.Units | |
type UnitFactorsOf Number Source # | |
Defined in Data.Metrology.Units |
data Dimensionless Source #
The dimension for the dimensionless quantities.
It is also called "quantities of dimension one", but
One
is confusing with the type-level integer One.
Instances
Dimension Dimensionless Source # | |
Defined in Data.Metrology.Units type DimFactorsOf Dimensionless :: [Factor Type] Source # | |
type DefaultUnitOfDim Dimensionless Source # | |
Defined in Data.Metrology.Units | |
type DimFactorsOf Dimensionless Source # | |
Defined in Data.Metrology.Units |
class Units units => UnitFactor (units :: [Factor *]) Source #
Classifies well-formed list of unit factors, and permits calculating a conversion ratio for the purposes of LCSU conversions.
canonicalConvRatioSpec
Instances
UnitFactor ([] :: [Factor Type]) Source # | |
Defined in Data.Metrology.Units canonicalConvRatioSpec :: Proxy [] -> Rational | |
(UnitFactor rest, Unit unit, SingI n) => UnitFactor (F unit n ': rest) Source # | |
Defined in Data.Metrology.Units canonicalConvRatioSpec :: Proxy (F unit n ': rest) -> Rational |
type family BaseHasConvRatio unit where ... Source #
Essentially, a constraint that checks if a conversion ratio can be
calculated for a BaseUnit
of a unit.
BaseHasConvRatio unit = HasConvRatio (IsCanonical unit) unit |
type family CanonicalUnit' (base_unit :: *) (unit :: *) :: * where ... Source #
Helper function in CanonicalUnit
CanonicalUnit' Canonical unit = unit | |
CanonicalUnit' base unit = CanonicalUnit' (BaseUnit base) base |
type CanonicalUnit (unit :: *) = CanonicalUnit' (BaseUnit unit) unit Source #
Get the canonical unit from a given unit.
For example: CanonicalUnit Foot = Meter
type family IsCanonical (unit :: *) where ... Source #
Is this unit a canonical unit?
IsCanonical unit = BaseUnit unit == Canonical |
type family DimOfUnitIsConsistent unit :: Constraint where ... Source #
Check to make sure that a unit has the same dimension as its base unit, if any.
class DimOfUnitIsConsistent unit => Unit unit where Source #
Nothing
type BaseUnit unit :: * Source #
The base unit of this unit: what this unit is defined in terms of.
For units that are not defined in terms of anything else, the base unit
should be Canonical
.
type DimOfUnit unit :: * Source #
The dimension that this unit is associated with. This needs to be defined only for canonical units; other units are necessarily of the same dimension as their base.
type UnitFactorsOf unit :: [Factor *] Source #
The internal list of canonical units corresponding to this unit. Overriding the default should not be necessary in user code.
conversionRatio :: unit -> Rational Source #
The conversion ratio from the base unit to this unit. If left out, a conversion ratio of 1 is assumed.
For example:
instance Unit Foot where type BaseUnit Foot = Meter conversionRatio _ = 0.3048
Implementations should never examine their argument!
Instances
Unit Number Source # | |
((unit == Canonical) ~ False, Unit unit, UnitPrefix prefix) => Unit (prefix :@ unit) Source # | |
Defined in Data.Metrology.Combinators type BaseUnit (prefix :@ unit) :: Type Source # type DimOfUnit (prefix :@ unit) :: Type Source # type UnitFactorsOf (prefix :@ unit) :: [Factor Type] Source # conversionRatio :: (prefix :@ unit) -> Rational Source # canonicalConvRatio :: (prefix :@ unit) -> Rational | |
(Unit unit, SingI power) => Unit (unit :^ power) Source # | |
(Unit u1, Unit u2) => Unit (u1 :/ u2) Source # | |
(Unit u1, Unit u2) => Unit (u1 :* u2) Source # | |
Dummy type use just to label canonical units. It does not have a
Unit
instance.
type family (d1 :: *) %/ (d2 :: *) :: * infixl 7 Source #
Divide two quantity types to produce a new one
type family (d1 :: *) %* (d2 :: *) :: * infixl 7 Source #
Multiply two quantity types to produce a new one. For example:
type Velocity = Length %/ Time
type MkQu_ULN unit = Qu (DimFactorsOf (DimOfUnit unit)) Source #
Make a quantity type with a unit and LCSU with custom numerical type. The quantity will have the dimension corresponding to the unit.
type MkQu_U unit = Qu (DimFactorsOf (DimOfUnit unit)) DefaultLCSU Double Source #
Make a quantity type with a given unit. It will be stored as a Double
.
Note that the corresponding dimension must have an appropriate instance
for DefaultUnitOfDim
for this to work.
type MkQu_DLN dim = Qu (DimFactorsOf dim) Source #
Make a quantity type with a custom numerical type and LCSU.
type MkQu_D dim = Qu (DimFactorsOf dim) DefaultLCSU Double Source #
Make a quantity type capable of storing a value of a given
unit. This uses a Double
for storage of the value. For example:
data LengthDim = LengthDim instance Dimension LengthDim data Meter = Meter instance Unit Meter where type BaseUnit Meter = Canonical type DimOfUnit Meter = LengthDim type instance DefaultUnitOfDim LengthDim = Meter type Length = MkQu_D LengthDim
Note that the dimension must have an instance for the type family
DefaultUnitOfDim
for this to work.
data Qu (a :: [Factor *]) (lcsu :: LCSU *) (n :: *) Source #
Qu
adds a dimensional annotation to its numerical value type
n
. This is the representation for all quantities.
Instances
Eq n => Eq (Qu d l n) Source # | |
(d ~ ([] :: [Factor Type]), Floating n) => Floating (Qu d l n) Source # | |
Defined in Data.Metrology.Qu sqrt :: Qu d l n -> Qu d l n # (**) :: Qu d l n -> Qu d l n -> Qu d l n # logBase :: Qu d l n -> Qu d l n -> Qu d l n # asin :: Qu d l n -> Qu d l n # acos :: Qu d l n -> Qu d l n # atan :: Qu d l n -> Qu d l n # sinh :: Qu d l n -> Qu d l n # cosh :: Qu d l n -> Qu d l n # tanh :: Qu d l n -> Qu d l n # asinh :: Qu d l n -> Qu d l n # acosh :: Qu d l n -> Qu d l n # atanh :: Qu d l n -> Qu d l n # log1p :: Qu d l n -> Qu d l n # expm1 :: Qu d l n -> Qu d l n # | |
(d ~ ([] :: [Factor Type]), Fractional n) => Fractional (Qu d l n) Source # | |
(d ~ ([] :: [Factor Type]), Num n) => Num (Qu d l n) Source # | |
Ord n => Ord (Qu d l n) Source # | |
Defined in Data.Metrology.Qu | |
Read n => Read (Qu ([] :: [Factor Type]) l n) Source # | |
(d ~ ([] :: [Factor Type]), Real n) => Real (Qu d l n) Source # | |
Defined in Data.Metrology.Qu toRational :: Qu d l n -> Rational # | |
(d ~ ([] :: [Factor Type]), RealFloat n) => RealFloat (Qu d l n) Source # | |
Defined in Data.Metrology.Qu floatRadix :: Qu d l n -> Integer # floatDigits :: Qu d l n -> Int # floatRange :: Qu d l n -> (Int, Int) # decodeFloat :: Qu d l n -> (Integer, Int) # encodeFloat :: Integer -> Int -> Qu d l n # significand :: Qu d l n -> Qu d l n # scaleFloat :: Int -> Qu d l n -> Qu d l n # isInfinite :: Qu d l n -> Bool # isDenormalized :: Qu d l n -> Bool # isNegativeZero :: Qu d l n -> Bool # | |
(d ~ ([] :: [Factor Type]), RealFrac n) => RealFrac (Qu d l n) Source # | |
Show n => Show (Qu ([] :: [Factor Type]) l n) Source # | |
(ShowUnitFactor (LookupList dims lcsu), Show n) => Show (Qu dims lcsu n) Source # | |
NFData n => NFData (Qu d l n) Source # | |
Defined in Data.Metrology.Qu | |
VectorSpace n => VectorSpace (Qu d l n) Source # | |
AdditiveGroup n => AdditiveGroup (Qu d l n) Source # | |
ValidDL d l => Quantity (Qu d l n) Source # | |
Defined in Data.Metrology.Quantity type QuantityUnit (Qu d l n) :: Type Source # type QuantityLCSU (Qu d l n) :: LCSU Type Source # type QuantityRep (Qu d l n) :: Type Source # fromQuantity :: QuantityQu (Qu d l n) -> Qu d l n Source # toQuantity :: Qu d l n -> QuantityQu (Qu d l n) Source # | |
type Scalar (Qu d l n) Source # | |
Defined in Data.Metrology.Qu | |
type QuantityUnit (Qu d l n) Source # | |
Defined in Data.Metrology.Quantity | |
type QuantityLCSU (Qu d l n) Source # | |
Defined in Data.Metrology.Quantity | |
type QuantityRep (Qu d l n) Source # | |
Defined in Data.Metrology.Quantity | |
type (Qu d l n) %^ z Source # | |
Defined in Data.Metrology.Qu | |
type (Qu d1 l n) %/ (Qu d2 l n) Source # | |
type (Qu d1 l n) %* (Qu d2 l n) Source # | |
(|*|) :: Num n => Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n infixl 7 Source #
Multiply two quantities
(|/|) :: Fractional n => Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n infixl 7 Source #
Divide two quantities
(|^) :: (NonNegative z, Num n) => Qu a l n -> Sing z -> Qu (a @* z) l n infixr 8 Source #
Raise a quantity to a integer power, knowing at compile time that the integer is non-negative.
(|^^) :: Fractional n => Qu a l n -> Sing z -> Qu (a @* z) l n infixr 8 Source #
Raise a quantity to a integer power known at compile time
qNthRoot :: ((Zero < z) ~ True, Floating n) => Sing z -> Qu a l n -> Qu (a @/ z) l n Source #
Take the n'th root of a quantity, where n is known at compile time
(|<|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool infix 4 Source #
Check if one quantity is less than a compatible one
(|>|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool infix 4 Source #
Check if one quantity is greater than a compatible one
(|<=|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool infix 4 Source #
Check if one quantity is less than or equal to a compatible one
(|>=|) :: (d1 @~ d2, Ord n) => Qu d1 l n -> Qu d2 l n -> Bool infix 4 Source #
Check if one quantity is greater than or equal to a compatible one
(|==|) :: (d1 @~ d2, Eq n) => Qu d1 l n -> Qu d2 l n -> Bool infix 4 Source #
Check if two quantities are equal (uses the equality of the underlying numerical type)
(|/=|) :: (d1 @~ d2, Eq n) => Qu d1 l n -> Qu d2 l n -> Bool infix 4 Source #
Check if two quantities are not equal
:: (d0 @~ d1, d0 @~ d2, Num n, Ord n) | |
=> Qu d0 l n | epsilon |
-> Qu d1 l n | left hand side |
-> Qu d2 l n | right hand side |
-> Bool |
Compare two compatible quantities for approximate equality. If the difference between the left hand side and the right hand side arguments are less than or equal to the epsilon, they are considered equal.
:: (d0 @~ d1, d0 @~ d2, Num n, Ord n) | |
=> Qu d0 l n | epsilon |
-> Qu d1 l n | left hand side |
-> Qu d2 l n | right hand side |
-> Bool |
Compare two compatible quantities for approixmate inequality.
qNapprox e a b = not $ qApprox e a b
(/|) :: Fractional n => n -> Qu b l n -> Qu (Normalize ('[] @- b)) l n infixl 7 Source #
Divide a scalar by a quantity
qCubeRoot :: Floating n => Qu a l n -> Qu (a @/ Three) l n Source #
Take the cubic root of a quantity
defaultLCSU :: Qu dim DefaultLCSU n -> Qu dim DefaultLCSU n Source #
Use this to choose a default LCSU for a dimensioned quantity.
The default LCSU uses the DefaultUnitOfDim
representation for each
dimension.
redim :: d @~ e => Qu d l n -> Qu e l n Source #
Cast between equivalent dimension within the same CSU. for example [kg m s] and [s m kg]. See the README for more info.
class UnitPrefix prefix where Source #
A class for user-defined prefixes
multiplier :: Fractional f => prefix -> f Source #
This should return the desired multiplier for the prefix being defined. This function must not inspect its argument.
data prefix :@ unit infixr 9 Source #
Multiply a conversion ratio by some constant. Used for defining prefixes.
prefix :@ unit infixr 9 |
Instances
(Show prefix, Show unit) => Show (prefix :@ unit) Source # | |
((unit == Canonical) ~ False, Unit unit, UnitPrefix prefix) => Unit (prefix :@ unit) Source # | |
Defined in Data.Metrology.Combinators type BaseUnit (prefix :@ unit) :: Type Source # type DimOfUnit (prefix :@ unit) :: Type Source # type UnitFactorsOf (prefix :@ unit) :: [Factor Type] Source # conversionRatio :: (prefix :@ unit) -> Rational Source # canonicalConvRatio :: (prefix :@ unit) -> Rational | |
type BaseUnit (prefix :@ unit) Source # | |
Defined in Data.Metrology.Combinators | |
type DimOfUnit (prefix :@ unit) Source # | |
type UnitFactorsOf (prefix :@ unit) Source # | |
Defined in Data.Metrology.Combinators type UnitFactorsOf (prefix :@ unit) = If (IsCanonical (prefix :@ unit)) (F (prefix :@ unit) One ': ([] :: [Factor Type])) (UnitFactorsOf (BaseUnit (prefix :@ unit))) |
data unit :^ (power :: Z) infixr 8 Source #
Raise a unit to a power, known at compile time
Instances
(Show u1, SingI power) => Show (u1 :^ power) Source # | |
Dimension dim => Dimension (dim :^ power) Source # | |
Defined in Data.Metrology.Combinators | |
(Unit unit, SingI power) => Unit (unit :^ power) Source # | |
type DefaultUnitOfDim (d :^ z) Source # | |
Defined in Data.Metrology.Combinators | |
type DimFactorsOf (dim :^ power) Source # | |
Defined in Data.Metrology.Combinators | |
type BaseUnit (unit :^ power) Source # | |
Defined in Data.Metrology.Combinators | |
type DimOfUnit (unit :^ power) Source # | |
Defined in Data.Metrology.Combinators | |
type UnitFactorsOf (unit :^ power) Source # | |
Defined in Data.Metrology.Combinators |
data u1 :/ u2 infixl 7 Source #
Divide two units to get another unit
u1 :/ u2 infixl 7 |
Instances
(Show u1, Show u2) => Show (u1 :/ u2) Source # | |
(Dimension d1, Dimension d2) => Dimension (d1 :/ d2) Source # | |
Defined in Data.Metrology.Combinators | |
(Unit u1, Unit u2) => Unit (u1 :/ u2) Source # | |
type DefaultUnitOfDim (d1 :/ d2) Source # | |
Defined in Data.Metrology.Combinators | |
type DimFactorsOf (d1 :/ d2) Source # | |
Defined in Data.Metrology.Combinators | |
type BaseUnit (u1 :/ u2) Source # | |
Defined in Data.Metrology.Combinators | |
type DimOfUnit (u1 :/ u2) Source # | |
type UnitFactorsOf (u1 :/ u2) Source # | |
Defined in Data.Metrology.Combinators |
data u1 :* u2 infixl 7 Source #
Multiply two units to get another unit.
For example: type MetersSquared = Meter :* Meter
u1 :* u2 infixl 7 |
Instances
(Show u1, Show u2) => Show (u1 :* u2) Source # | |
(Dimension d1, Dimension d2) => Dimension (d1 :* d2) Source # | |
Defined in Data.Metrology.Combinators | |
(Unit u1, Unit u2) => Unit (u1 :* u2) Source # | |
type DefaultUnitOfDim (d1 :* d2) Source # | |
Defined in Data.Metrology.Combinators | |
type DimFactorsOf (d1 :* d2) Source # | |
Defined in Data.Metrology.Combinators | |
type BaseUnit (u1 :* u2) Source # | |
Defined in Data.Metrology.Combinators | |
type DimOfUnit (u1 :* u2) Source # | |
type UnitFactorsOf (u1 :* u2) Source # | |
Defined in Data.Metrology.Combinators |
type family DefaultConvertibleLCSU_U (unit :: *) (l :: LCSU *) :: Constraint where ... Source #
Check if the DefaultLCSU
can convert into the given one, at the given
unit.
DefaultConvertibleLCSU_U unit l = DefaultConvertibleLCSU_D (DimOfUnit unit) l |
type family DefaultConvertibleLCSU_D (dim :: *) (l :: LCSU *) :: Constraint where ... Source #
Check if the DefaultLCSU
can convert into the given one, at the given
dimension.
DefaultConvertibleLCSU_D dim l = (ValidDL (DimFactorsOf dim) DefaultLCSU, ConvertibleLCSUs (DimFactorsOf dim) DefaultLCSU l) |
type family CompatibleDim (lcsu :: LCSU *) (dim :: *) :: Constraint where ... Source #
Check if an LCSU can express the given dimension
CompatibleDim lcsu dim = (UnitFactor (LookupList (DimFactorsOf dim) lcsu), DimOfUnit (Lookup dim lcsu) ~ dim) |
type family CompatibleUnit (lcsu :: LCSU *) (unit :: *) :: Constraint where ... Source #
Check if an LCSU has consistent entries for the given unit. i.e. can the lcsu describe the unit?
CompatibleUnit lcsu unit = (ValidDLU (DimFactorsOf (DimOfUnit unit)) lcsu unit, UnitFactor (LookupList (DimFactorsOf (DimOfUnit unit)) lcsu)) |
type family CanonicalUnitsOfFactors (fs :: [Factor *]) :: [*] where ... Source #
Given a list of unit factors, extract out the canonical units they are based on.
CanonicalUnitsOfFactors '[] = '[] | |
CanonicalUnitsOfFactors (F u z ': fs) = CanonicalUnit u ': CanonicalUnitsOfFactors fs |
type family (units1 :: [Factor *]) *~ (units2 :: [Factor *]) :: Constraint where ... infix 4 Source #
Check if two [Factor *]
s, representing units, should be
considered to be equal
units1 *~ units2 = CanonicalUnitsOfFactors units1 `SetEqual` CanonicalUnitsOfFactors units2 |
type family ConvertibleLCSUs_D (dim :: *) (l1 :: LCSU *) (l2 :: LCSU *) :: Constraint where ... Source #
Like ConvertibleLCSUs
, but takes a dimension, not a dimension factors.
ConvertibleLCSUs_D dim l1 l2 = ConvertibleLCSUs (DimFactorsOf dim) l1 l2 |
type family ConvertibleLCSUs (dfactors :: [Factor *]) (l1 :: LCSU *) (l2 :: LCSU *) :: Constraint where ... Source #
Are two LCSUs inter-convertible at the given dimension?
ConvertibleLCSUs dfactors l1 l2 = (LookupList dfactors l1 *~ LookupList dfactors l2, ValidDL dfactors l1, ValidDL dfactors l2, UnitFactor (LookupList dfactors l1), UnitFactor (LookupList dfactors l2)) |
type family ValidDL (dfactors :: [Factor *]) (lcsu :: LCSU *) :: Constraint where ... Source #
Check if a (dimension factors, LCSU) pair are valid to be used together. This checks that each dimension maps to a unit of the correct dimension.
ValidDL dfactors lcsu = ValidDLU dfactors lcsu (UnitOfDimFactors dfactors lcsu) |
type family ValidDLU (dfactors :: [Factor *]) (lcsu :: LCSU *) (unit :: *) where ... Source #
Check if a (dimension factors, LCSU, unit) triple are all valid to be used together.
ValidDLU dfactors lcsu unit = (dfactors ~ DimFactorsOf (DimOfUnit unit), UnitFactor (LookupList dfactors lcsu), Unit unit, UnitFactorsOf unit *~ LookupList dfactors lcsu) |
type family UnitOfDimFactors (dims :: [Factor *]) (lcsu :: LCSU *) :: * where ... Source #
Extract a unit from a dimension factor list and an LCSU
UnitOfDimFactors dims lcsu = MultUnitFactors (LookupList dims lcsu) |
type family MultUnitFactors (facts :: [Factor *]) where ... Source #
Extract a unit specifier from a list of factors
MultUnitFactors '[] = Number | |
MultUnitFactors (F unit z ': units) = (unit :^ z) :* MultUnitFactors units |
type family MultDimFactors (facts :: [Factor *]) where ... Source #
Extract a dimension specifier from a list of factors
MultDimFactors '[] = Dimensionless | |
MultDimFactors (F d z ': ds) = (d :^ z) :* MultDimFactors ds |
showIn :: (ValidDLU dim lcsu unit, Fractional n, Show unit, Show n) => Qu dim lcsu n -> unit -> String infix 1 Source #
Show a dimensioned quantity in a given unit. (The default Show
instance always uses units as specified in the LCSU.)
convert :: forall d l1 l2 n. (ConvertibleLCSUs d l1 l2, Fractional n) => Qu d l1 n -> Qu d l2 n Source #
Dimension-keeping cast between different CSUs.
constant :: (d @~ e, ConvertibleLCSUs e DefaultLCSU l, Fractional n) => Qu d DefaultLCSU n -> Qu e l n Source #
Compute the argument in the DefaultLCSU
, and present the result as
lcsu-polymorphic dimension-polymorphic value. Named constant
because one
of its dominant usecase is to inject constant quantities into
dimension-polymorphic expressions.
zero :: Num n => Qu dimspec l n Source #
The number 0, polymorphic in its dimension. Use of this will often require a type annotation.
(|+|) :: (d1 @~ d2, Num n) => Qu d1 l n -> Qu d2 l n -> Qu d1 l n infixl 6 Source #
Add two compatible quantities
(|-|) :: (d1 @~ d2, Num n) => Qu d1 l n -> Qu d2 l n -> Qu d1 l n infixl 6 Source #
Subtract two compatible quantities
qSum :: (Foldable f, Num n) => f (Qu d l n) -> Qu d l n Source #
Take the sum of a list of quantities
(*|) :: Num n => n -> Qu b l n -> Qu b l n infixl 7 Source #
Multiply a quantity by a scalar from the left