-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Statically checked physical dimensions, -- using Type Families and Data Kinds. -- -- Dimensional is a library providing data types for performing -- arithmetic with physical quantities and units. Information about the -- physical dimensions of the quantities and units is embedded in their -- types and the validity of operations is verified by the type checker -- at compile time. The boxing and unboxing of numerical values as -- quantities is done by multiplication and division with units. The -- library is designed to, as far as is practical, enforce/encourage best -- practices of unit usage. Version 1 of the dimensional package differs -- from earlier version in that the dimension tracking is implemented -- using Closed Type Families and Data Kinds rather than functional -- dependencies. This enables a number of features, including improved -- support for unit names and quantities with statically-unknown -- dimensions. Requires GHC 7.8 or later. @package dimensional @version 1.1 -- | This module defines physical dimensions expressed in terms of the SI -- base dimensions, including arithmetic. module Numeric.Units.Dimensional.Dimensions.TermLevel -- | A physical dimension, encoded as 7 integers, representing a -- factorization of the dimension into the 7 SI base dimensions. By -- convention they are stored in the same order as in the -- Dimension data kind. data Dimension' Dim' :: !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> Dimension' -- | Dimensional values inhabit this class, which allows access to a -- term-level representation of their dimension. class HasDynamicDimension a => HasDimension a -- | Obtains a term-level representation of a value's dimension. dimension :: HasDimension a => a -> Dimension' -- | Dimensional values, or those that are only possibly dimensional, -- inhabit this class, which allows access to a term-level representation -- of their dimension. class HasDynamicDimension a -- | Gets the 'DynamicDimension of a dynamic dimensional value, which may -- be NoDimension if it does not represent a dimensional value of -- any Dimension. -- -- A default implementation is available for types that are also in the -- HasDimension typeclass. dynamicDimension :: HasDynamicDimension a => a -> DynamicDimension -- | Gets the 'DynamicDimension of a dynamic dimensional value, which may -- be NoDimension if it does not represent a dimensional value of -- any Dimension. -- -- A default implementation is available for types that are also in the -- HasDimension typeclass. dynamicDimension :: (HasDynamicDimension a, (HasDimension a)) => a -> DynamicDimension -- | The dimension of a dynamic value, which may not have any dimension at -- all. data DynamicDimension -- | The value has no valid dimension. NoDimension :: DynamicDimension -- | The value has the given dimension. SomeDimension :: Dimension' -> DynamicDimension -- | The value may be interpreted as having any dimension. AnyDimension :: DynamicDimension -- | Forms the product of two dimensions. (*) :: Dimension' -> Dimension' -> Dimension' infixl 7 * -- | Forms the quotient of two dimensions. (/) :: Dimension' -> Dimension' -> Dimension' infixl 7 / -- | Raises a dimension to an integer power. (^) :: Dimension' -> Int -> Dimension' infixr 8 ^ -- | Forms the reciprocal of a dimension. recip :: Dimension' -> Dimension' -- | Takes the nth root of a dimension, if it exists. -- -- n must not be zero. -- --
--   nroot (negate n) d == nroot n (recip d)
--   
nroot :: Int -> Dimension' -> Maybe Dimension' -- | Takes the square root of a dimension, if it exists. -- --
--   sqrt d == nroot 2 d
--   
sqrt :: Dimension' -> Maybe Dimension' -- | Takes the cube root of a dimension, if it exists. -- --
--   cbrt d == nroot 3 d
--   
cbrt :: Dimension' -> Maybe Dimension' -- | The dimension of dimensionless values. dOne :: Dimension' dLength :: Dimension' dMass :: Dimension' dTime :: Dimension' dElectricCurrent :: Dimension' dThermodynamicTemperature :: Dimension' dAmountOfSubstance :: Dimension' dLuminousIntensity :: Dimension' -- | Converts a dimension to a list of 7 integers, representing the -- exponent associated with each of the 7 SI base dimensions in the -- standard order. asList :: Dimension' -> [Int] -- | Combines two DynamicDimensions, determining the -- DynamicDimension of a quantity that must match both inputs. -- -- This is the lattice meet operation for DynamicDimension. matchDimensions :: DynamicDimension -> DynamicDimension -> DynamicDimension -- | Determines if a value that has a DynamicDimension is compatible -- with a specified Dimension'. isCompatibleWith :: (HasDynamicDimension a) => a -> Dimension' -> Bool -- | Determines if a value that has a DynamicDimension in fact has -- any valid dimension at all. hasSomeDimension :: (HasDynamicDimension a) => a -> Bool instance GHC.Generics.Generic Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance Data.Data.Data Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Show.Show Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Classes.Ord Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Classes.Eq Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Generics.Generic Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Data.Data.Data Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Classes.Ord Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Classes.Eq Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Show.Show Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDimension Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Control.DeepSeq.NFData Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance Control.DeepSeq.NFData Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Data.Semigroup.Semigroup Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Base.Monoid Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' -- | This module defines type-level physical dimensions expressed in terms -- of the SI base dimensions using NumType for type-level -- integers. -- -- Type-level arithmetic, synonyms for the base dimensions, and -- conversion to the term-level are included. module Numeric.Units.Dimensional.Dimensions.TypeLevel -- | Represents a physical dimension in the basis of the 7 SI base -- dimensions, where the respective dimensions are represented by type -- variables using the following convention: -- -- -- -- For the equivalent term-level representation, see Dimension' data Dimension Dim :: TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> Dimension -- | Multiplication of dimensions corresponds to adding of the base -- dimensions' exponents. -- | Division of dimensions corresponds to subtraction of the base -- dimensions' exponents. -- | Powers of dimensions corresponds to multiplication of the base -- dimensions' exponents by the exponent. -- -- We limit ourselves to integer powers of Dimensionals as fractional -- powers make little physical sense. -- | The reciprocal of a dimension is defined as the result of dividing -- DOne by it, or of negating each of the base dimensions' -- exponents. type Recip (d :: Dimension) = DOne / d -- | Roots of dimensions corresponds to division of the base dimensions' -- exponents by the order of the root. -- | Square root is a special case of NRoot with order 2. type Sqrt d = NRoot d 'Pos2 -- | Cube root is a special case of NRoot with order 3. type Cbrt d = NRoot d 'Pos3 -- | The type-level dimension of dimensionless values. type DOne = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DLength = 'Dim 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DMass = 'Dim 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DTime = 'Dim 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero type DElectricCurrent = 'Dim 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero type DThermodynamicTemperature = 'Dim 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero type DAmountOfSubstance = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero type DLuminousIntensity = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 -- | A KnownDimension is one for which we can construct a term-level -- representation. Each validly constructed type of kind Dimension -- has a KnownDimension instance. -- -- While KnownDimension is a constraint synonym, the presence of -- KnownDimension d in a context allows use of -- dimension :: Proxy d -> Dimension'. type KnownDimension (d :: Dimension) = HasDimension (Proxy d) instance (Numeric.NumType.DK.Integers.KnownTypeInt l, Numeric.NumType.DK.Integers.KnownTypeInt m, Numeric.NumType.DK.Integers.KnownTypeInt t, Numeric.NumType.DK.Integers.KnownTypeInt i, Numeric.NumType.DK.Integers.KnownTypeInt th, Numeric.NumType.DK.Integers.KnownTypeInt n, Numeric.NumType.DK.Integers.KnownTypeInt j) => Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension (Data.Proxy.Proxy ('Numeric.Units.Dimensional.Dimensions.TypeLevel.Dim l m t i th n j)) instance (Numeric.NumType.DK.Integers.KnownTypeInt l, Numeric.NumType.DK.Integers.KnownTypeInt m, Numeric.NumType.DK.Integers.KnownTypeInt t, Numeric.NumType.DK.Integers.KnownTypeInt i, Numeric.NumType.DK.Integers.KnownTypeInt th, Numeric.NumType.DK.Integers.KnownTypeInt n, Numeric.NumType.DK.Integers.KnownTypeInt j) => Numeric.Units.Dimensional.Dimensions.TermLevel.HasDimension (Data.Proxy.Proxy ('Numeric.Units.Dimensional.Dimensions.TypeLevel.Dim l m t i th n j)) -- | Provides both term-level and type-level representations for physical -- dimensions in a single import for convenience. -- -- Presuming that users intend to work primarily with type level -- dimensions, this module hides arithmetic operators over term level -- dimensions and aliases for the base term-level dimensions to avoid -- namespace pollution. These features are available directly from -- Numeric.Units.Dimensional.Dimensions.TermLevel if desired. module Numeric.Units.Dimensional.Dimensions module Numeric.Units.Dimensional.UnitNames.InterchangeNames -- | Represents the authority which issued an interchange name for a unit. data InterchangeNameAuthority -- | The interchange name originated with the Unified Code for Units of -- Measure. UCUM :: InterchangeNameAuthority -- | The interchange name originated with the dimensional library. DimensionalLibrary :: InterchangeNameAuthority -- | The interchange name originated with a user of the dimensional -- library. Custom :: InterchangeNameAuthority data InterchangeName InterchangeName :: String -> InterchangeNameAuthority -> Bool -> InterchangeName [name] :: InterchangeName -> String [authority] :: InterchangeName -> InterchangeNameAuthority [isAtomic] :: InterchangeName -> Bool -- | Determines the authority which issued the interchange name of a unit -- or unit name. For composite units, this is the least-authoritative -- interchange name of any constituent name. -- -- Note that the least-authoritative authority is the one sorted as -- greatest by the Ord instance of -- InterchangeNameAuthority. class HasInterchangeName a interchangeName :: HasInterchangeName a => a -> InterchangeName instance GHC.Generics.Generic Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance Data.Data.Data Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance GHC.Classes.Ord Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance GHC.Classes.Eq Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance GHC.Generics.Generic Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeNameAuthority instance Data.Data.Data Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeNameAuthority instance GHC.Show.Show Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeNameAuthority instance GHC.Classes.Ord Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeNameAuthority instance GHC.Classes.Eq Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeNameAuthority instance Numeric.Units.Dimensional.UnitNames.InterchangeNames.HasInterchangeName Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance Control.DeepSeq.NFData Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance GHC.Show.Show Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeName instance Control.DeepSeq.NFData Numeric.Units.Dimensional.UnitNames.InterchangeNames.InterchangeNameAuthority -- | Provides a type level representation of Variants of dimensional -- values, which may be quantities or units. module Numeric.Units.Dimensional.Variants -- | The kind of variants of dimensional values. data Variant -- | The value is a quantity, stored as an ExactPi multiple of its -- value in its dimension's SI coherent unit. DQuantity :: ExactPi' -> Variant -- | The value is a unit, possibly a Metric unit. DUnit :: Metricality -> Variant -- | Encodes whether a unit is a metric unit, that is, whether it can be -- combined with a metric prefix to form a related unit. data Metricality -- | Capable of receiving a metric prefix. Metric :: Metricality -- | Incapable of receiving a metric prefix. NonMetric :: Metricality -- | Forms the product of two Variants. -- -- The product of units is a non-metric unit. -- -- The product of quantities is a quantity. -- | Weakens a Variant by forgetting possibly uninteresting -- type-level information. -- | Two Variants are compatible when dimensional values of the -- first may be converted into the second merely by changing the -- representation of their values. type CompatibleVariants v1 v2 = ( 'True ~ AreCompatible v1 v2) instance GHC.Generics.Generic Numeric.Units.Dimensional.Variants.Variant instance GHC.Generics.Generic Numeric.Units.Dimensional.Variants.Metricality instance Data.Data.Data Numeric.Units.Dimensional.Variants.Metricality instance GHC.Classes.Ord Numeric.Units.Dimensional.Variants.Metricality instance GHC.Classes.Eq Numeric.Units.Dimensional.Variants.Metricality instance Control.DeepSeq.NFData Numeric.Units.Dimensional.Variants.Metricality -- | This module provides types and functions for manipulating unit names. -- -- Please note that the details of the name representation may be less -- stable than the other APIs provided by this package, as new features -- using them are still being developed. module Numeric.Units.Dimensional.UnitNames -- | The name of a unit. data UnitName (m :: Metricality) -- | Represents the name of an atomic unit or prefix. data NameAtom (m :: NameAtomType) data Prefix -- | The name of a metric prefix. type PrefixName = NameAtom 'PrefixAtom -- | Encodes whether a unit is a metric unit, that is, whether it can be -- combined with a metric prefix to form a related unit. data Metricality -- | Capable of receiving a metric prefix. Metric :: Metricality -- | Incapable of receiving a metric prefix. NonMetric :: Metricality -- | Constructs an atomic name for a custom unit. atom :: String -> String -> String -> UnitName 'NonMetric -- | Forms a UnitName from a Metric name by applying a metric -- prefix. applyPrefix :: Prefix -> UnitName 'Metric -> UnitName 'NonMetric -- | Form a UnitName by taking the product of two others. (*) :: UnitName m1 -> UnitName m2 -> UnitName 'NonMetric infixl 7 * -- | Form a UnitName by dividing one by another. (/) :: UnitName m1 -> UnitName m2 -> UnitName 'NonMetric infixl 7 / -- | Form a UnitName by raising a name to an integer power. (^) :: UnitName m -> Int -> UnitName 'NonMetric infixr 8 ^ -- | Forms the product of a list of UnitNames. -- -- If you wish to form a heterogenous product of Metric and -- NonMetric units you should apply weaken to the -- Metric ones. product :: Foldable f => f (UnitName 'NonMetric) -> UnitName 'NonMetric reduce :: UnitName m -> UnitName m -- | Constructs a UnitName by applying a grouping operation to -- another UnitName, which may be useful to express precedence. grouped :: UnitName m -> UnitName 'NonMetric -- | The name of the base unit associated with a specified dimension. baseUnitName :: Dimension' -> UnitName 'NonMetric -- | A list of all Prefixes defined by the SI. siPrefixes :: [Prefix] -- | The name of the unit of dimensionless values. nOne :: UnitName 'NonMetric -- | The name of a metric prefix. prefixName :: Prefix -> PrefixName -- | The scale factor denoted by a metric prefix. scaleFactor :: Prefix -> Rational -- | The type of a unit name transformation that may be associated with an -- operation that takes a single unit as input. type UnitNameTransformer = (forall m. UnitName m -> UnitName 'NonMetric) -- | The type of a unit name transformation that may be associated with an -- operation that takes two units as input. type UnitNameTransformer2 = (forall m1 m2. UnitName m1 -> UnitName m2 -> UnitName 'NonMetric) -- | Convert a UnitName which may or may not be Metric to one -- which is certainly NonMetric. weaken :: UnitName m -> UnitName 'NonMetric -- | Attempt to convert a UnitName which may or may not be -- Metric to one which is certainly Metric. strengthen :: UnitName m -> Maybe (UnitName 'Metric) -- | Convert a UnitName of one Metricality into a name of -- another metricality by strengthening or weakening if neccessary. -- Because it may not be possible to strengthen, the result is returned -- in a Maybe wrapper. relax :: forall m1 m2. (Typeable m1, Typeable m2) => UnitName m1 -> Maybe (UnitName m2) -- | The full name of the unit in international English name_en :: NameAtom m -> String -- | The abbreviated name of the unit in international English abbreviation_en :: NameAtom m -> String asAtomic :: UnitName m -> Maybe (NameAtom ( 'UnitAtom m)) -- | Re-exports the raw Quantity constructor from the -- Numeric.Units.Dimensional.Internal module, along with coerce, -- for convenience in converting between raw representations and -- dimensional values. -- -- Note that use of these constructs requires the user to verify the -- dimensional safety of the conversion, because the coercion doesn't -- explicitly mention the unit of the representation. Note also that the -- Quantity constructor constructs a SQuantity which may -- have a scale factor other than One. -- -- Note that the haddock documentation doesn't mention the -- Quantity constructor because it is a part of the -- Dimensional associated data family, but it is exported by this -- module. module Numeric.Units.Dimensional.Coercion -- | The function coerce allows you to safely convert between -- values of types that have the same representation with no run-time -- overhead. In the simplest case you can use it instead of a newtype -- constructor, to go from the newtype's concrete type to the abstract -- type. But it also works in more complicated settings, e.g. converting -- a list of newtypes to a list of concrete types. coerce :: Coercible * a b => a -> b -- | Unwraps a possibly-scaled SQuantity, yielding its underlying -- representation. -- -- This is a type-restricted version of coerce. unQuantity :: SQuantity s d a -> a -- |

Summary

-- -- In this module we provide data types for performing arithmetic with -- physical quantities and units. Information about the physical -- dimensions of the quantities/units is embedded in their types and the -- validity of operations is verified by the type checker at compile -- time. The boxing and unboxing of numerical values as quantities is -- done by multiplication and division of units, of which an incomplete -- set is provided. -- -- We limit ourselves to "Newtonian" physics. We do not attempt to -- accommodate relativistic physics in which e.g. addition of length and -- time would be valid. -- -- As far as possible and/or practical the conventions and guidelines of -- NIST's "Guide for the Use of the International System of Units (SI)" -- [1] are followed. Occasionally we will reference specific -- sections from the guide and deviations will be explained. -- --

Disclaimer

-- -- Merely an engineer, the author doubtlessly uses a language and -- notation that makes mathematicians and physicist cringe. He does not -- mind constructive criticism (or pull requests). -- -- The sets of functions and units defined herein are incomplete and -- reflect only the author's needs to date. Again, patches are welcome. -- --

Usage

-- --

Preliminaries

-- -- This module requires GHC 7.8 or later. We utilize Data Kinds, -- TypeNats, Closed Type Families, etc. Clients of the module are -- generally not required to use these extensions. -- -- Clients probably will want to use the NegativeLiterals extension. -- --

Examples

-- -- We have defined operators and units that allow us to define and work -- with physical quantities. A physical quantity is defined by -- multiplying a number with a unit (the type signature is optional). -- --
--   v :: Velocity Prelude.Double
--   v = 90 *~ (kilo meter / hour)
--   
-- -- It follows naturally that the numerical value of a quantity is -- obtained by division by a unit. -- --
--   numval :: Prelude.Double
--   numval = v /~ (meter / second)
--   
-- -- The notion of a quantity as the product of a numerical value and a -- unit is supported by 7.1 "Value and numerical value of a quantity" of -- [1]. While the above syntax is fairly natural it is unfortunate -- that it must violate a number of the guidelines in [1], in -- particular 9.3 "Spelling unit names with prefixes", 9.4 "Spelling unit -- names obtained by multiplication", 9.5 "Spelling unit names obtained -- by division". -- -- As a more elaborate example of how to use the module we define a -- function for calculating the escape velocity of a celestial body -- [2]. -- --
--   escapeVelocity :: (Floating a) => Mass a -> Length a -> Velocity a
--   escapeVelocity m r = sqrt (two * g * m / r)
--     where
--         two = 2 *~ one
--         g = 6.6720e-11 *~ (newton * meter ^ pos2 / kilo gram ^ pos2)
--   
-- -- For completeness we should also show an example of the error messages -- we will get from GHC when performing invalid arithmetic. In the best -- case GHC will be able to use the type synonyms we have defined in its -- error messages. -- --
--   let x = 1 *~ meter + 1 *~ second
--   
--   Couldn't match type 'Numeric.NumType.DK.Integers.Zero
--                  with 'Numeric.NumType.DK.Integers.Pos1
--   Expected type: Unit 'Metric DLength a
--     Actual type: Unit 'Metric DTime a
--   In the second argument of `(*~)', namely `second'
--   In the second argument of `(+)', namely `1 *~ second'
--   
-- -- In other cases the error messages aren't very friendly. -- --
--   let x = 1 *~ meter / (1 *~ second) + 1 *~ kilo gram
--   
--   Couldn't match type 'Numeric.NumType.DK.Integers.Zero
--                  with 'Numeric.NumType.DK.Integers.Neg1
--   Expected type: Quantity DMass a
--     Actual type: Dimensional
--                    ('DQuantity V.* 'DQuantity) (DLength / DTime) a
--   In the first argument of `(+)', namely `1 *~ meter / (1 *~ second)'
--   In the expression: 1 *~ meter / (1 *~ second) + 1 *~ kilo gram
--   In an equation for `x':
--         x = 1 *~ meter / (1 *~ second) + 1 *~ kilo gram
--   
-- -- It is the author's experience that the usefulness of the compiler -- error messages is more often than not limited to pinpointing the -- location of errors. -- --

Notes

-- --

Future work

-- -- While there is an insane amount of units in use around the world it is -- reasonable to provide those in relatively widespread use. Units -- outside of SI will most likely be added on an as-needed basis. -- -- Additional physics models could be implemented. See [3] for -- ideas. -- --

Related work

-- -- Henning Thielemann numeric prelude has a physical units library, -- however, checking of dimensions is dynamic rather than static. Aaron -- Denney has created a toy example of statically checked physical -- dimensions covering only length and time. HaskellWiki has pointers -- [4] to these. -- -- Also see Samuel Hoffstaetter's blog post [5] which uses -- techniques similar to this library. -- -- Libraries with similar functionality exist for other programming -- languages and may serve as inspiration. The author has found the Java -- library JScience [6] and the Fortress programming language -- [7] particularly noteworthy. -- --

References

-- --
    --
  1. http://physics.nist.gov/Pubs/SP811/
  2. --
  3. http://en.wikipedia.org/wiki/Escape_velocity
  4. -- --
  5. http://jscience.org/api/org/jscience/physics/models/package-summary.html
  6. --
  7. http://www.haskell.org/haskellwiki/Physical_units
  8. -- --
  9. http://liftm.wordpress.com/2007/06/03/scientificdimension-type-arithmetic-and-physical-units-in-haskell/
  10. --
  11. http://jscience.org/
  12. --
  13. http://research.sun.com/projects/plrg/fortress.pdf
  14. --
module Numeric.Units.Dimensional -- | A unit of measurement. type Unit (m :: Metricality) = Dimensional ( 'DUnit m) -- | A dimensional quantity. type Quantity = SQuantity One -- | Encodes whether a unit is a metric unit, that is, whether it can be -- combined with a metric prefix to form a related unit. data Metricality -- | Capable of receiving a metric prefix. Metric :: Metricality -- | Incapable of receiving a metric prefix. NonMetric :: Metricality -- | Represents a physical dimension in the basis of the 7 SI base -- dimensions, where the respective dimensions are represented by type -- variables using the following convention: -- -- -- -- For the equivalent term-level representation, see Dimension' data Dimension Dim :: TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> Dimension -- | Multiplication of dimensions corresponds to adding of the base -- dimensions' exponents. -- | Division of dimensions corresponds to subtraction of the base -- dimensions' exponents. -- | Powers of dimensions corresponds to multiplication of the base -- dimensions' exponents by the exponent. -- -- We limit ourselves to integer powers of Dimensionals as fractional -- powers make little physical sense. -- | Roots of dimensions corresponds to division of the base dimensions' -- exponents by the order of the root. -- | Square root is a special case of NRoot with order 2. type Sqrt d = NRoot d 'Pos2 -- | Cube root is a special case of NRoot with order 3. type Cbrt d = NRoot d 'Pos3 -- | The reciprocal of a dimension is defined as the result of dividing -- DOne by it, or of negating each of the base dimensions' -- exponents. type Recip (d :: Dimension) = DOne / d -- | A physical dimension, encoded as 7 integers, representing a -- factorization of the dimension into the 7 SI base dimensions. By -- convention they are stored in the same order as in the -- Dimension data kind. data Dimension' Dim' :: !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> Dimension' -- | Dimensional values inhabit this class, which allows access to a -- term-level representation of their dimension. class HasDynamicDimension a => HasDimension a -- | Obtains a term-level representation of a value's dimension. dimension :: HasDimension a => a -> Dimension' -- | A KnownDimension is one for which we can construct a term-level -- representation. Each validly constructed type of kind Dimension -- has a KnownDimension instance. -- -- While KnownDimension is a constraint synonym, the presence of -- KnownDimension d in a context allows use of -- dimension :: Proxy d -> Dimension'. type KnownDimension (d :: Dimension) = HasDimension (Proxy d) -- | Forms a Quantity by multipliying a number and a unit. (*~) :: (Num a) => a -> Unit m d a -> Quantity d a infixl 7 *~ -- | Divides a Quantity by a Unit of the same physical -- dimension, obtaining the numerical value of the quantity expressed in -- that unit. (/~) :: Fractional a => Quantity d a -> Unit m d a -> a infixl 7 /~ -- | Raises a Quantity or Unit to an integer power. -- -- Because the power chosen impacts the Dimension of the result, -- it is necessary to supply a type-level representation of the exponent -- in the form of a Proxy to some TypeInt. Convenience -- values pos1, pos2, neg1, ... are supplied by -- the Numeric.NumType.DK.Integers module. The most commonly used -- ones are also reexported by Numeric.Units.Dimensional.Prelude. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NotPrefixable. (^) :: (Fractional a, KnownTypeInt i, KnownVariant v, KnownVariant (Weaken v)) => Dimensional v d1 a -> Proxy i -> Dimensional (Weaken v) (d1 ^ i) a infixr 8 ^ -- | Computes the nth root of a Quantity using **. -- -- The NRoot type family will prevent application of this operator -- where the result would have a fractional dimension or where n is zero. -- -- Because the root chosen impacts the Dimension of the result, it -- is necessary to supply a type-level representation of the root in the -- form of a Proxy to some TypeInt. Convenience values -- pos1, pos2, neg1, ... are supplied by the -- Numeric.NumType.DK.Integers module. The most commonly used ones -- are also reexported by Numeric.Units.Dimensional.Prelude. -- -- Also available in prefix form, see nroot. (^/) :: (KnownTypeInt n, Floating a) => Quantity d a -> Proxy n -> Quantity (NRoot d n) a infixr 8 ^/ -- | Raises a dimensionless quantity to a dimensionless power. (**) :: Floating a => Dimensionless a -> Dimensionless a -> Dimensionless a infixr 8 ** -- | Multiplies two Quantitys or two Units. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NonMetric. (*) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 * v2), Num a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a infixl 7 * -- | Divides one Quantity by another or one Unit by another. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NotPrefixable. (/) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 / v2), Fractional a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 / v2) (d1 / d2) a infixl 7 / -- | Adds two Quantitys. (+) :: Num a => Quantity d a -> Quantity d a -> Quantity d a infixl 6 + -- | Subtracts one Quantity from another. (-) :: Num a => Quantity d a -> Quantity d a -> Quantity d a infixl 6 - -- | Negates the value of a Quantity. negate :: Num a => Quantity d a -> Quantity d a -- | Takes the absolute value of a Quantity. abs :: Num a => Quantity d a -> Quantity d a -- | Takes the sign of a Quantity. The functions abs and -- signum satisy the law that: -- --
--   abs x * signum x == x
--   
-- -- The sign is either negate _1 (negative), _0 (zero), -- or _1 (positive). signum :: Num a => Quantity d a -> Dimensionless a -- | Forms the reciprocal of a Quantity, which has the reciprocal -- dimension. -- --
--   >>> recip $ 47 *~ hertz
--   2.127659574468085e-2 s
--   
recip :: (Fractional a) => Quantity d a -> Quantity (Recip d) a -- | Computes the nth root of a Quantity using **. -- -- The NRoot type family will prevent application of this operator -- where the result would have a fractional dimension or where n is zero. -- -- Because the root chosen impacts the Dimension of the result, it -- is necessary to supply a type-level representation of the root in the -- form of a Proxy to some TypeInt. Convenience values -- pos1, pos2, neg1, ... are supplied by the -- Numeric.NumType.DK.Integers module. The most commonly used ones -- are also reexported by Numeric.Units.Dimensional.Prelude. -- -- n must not be zero. Negative roots are defined such that nroot -- (Proxy :: Proxy (Negate n)) x == nroot (Proxy :: Proxy n) (recip -- x). -- -- Also available in operator form, see ^/. nroot :: (KnownTypeInt n, Floating a) => Proxy n -> Quantity d a -> Quantity (NRoot d n) a -- | Computes the square root of a Quantity using **. -- -- The NRoot type family will prevent application where the -- supplied quantity does not have a square dimension. -- --
--   (x :: Area Double) >= _0 ==> sqrt x == nroot pos2 x
--   
sqrt :: Floating a => Quantity d a -> Quantity (Sqrt d) a -- | Computes the cube root of a Quantity using **. -- -- The NRoot type family will prevent application where the -- supplied quantity does not have a cubic dimension. -- --
--   (x :: Volume Double) >= _0 ==> cbrt x == nroot pos3 x
--   
cbrt :: Floating a => Quantity d a -> Quantity (Cbrt d) a exp :: Floating a => Dimensionless a -> Dimensionless a log :: Floating a => Dimensionless a -> Dimensionless a -- | Takes the logarithm of the second argument in the base of the first. -- --
--   >>> logBase _2 _8
--   3.0
--   
logBase :: Floating a => Dimensionless a -> Dimensionless a -> Dimensionless a sin :: Floating a => Dimensionless a -> Dimensionless a cos :: Floating a => Dimensionless a -> Dimensionless a tan :: Floating a => Dimensionless a -> Dimensionless a asin :: Floating a => Dimensionless a -> Dimensionless a acos :: Floating a => Dimensionless a -> Dimensionless a atan :: Floating a => Dimensionless a -> Dimensionless a sinh :: Floating a => Dimensionless a -> Dimensionless a cosh :: Floating a => Dimensionless a -> Dimensionless a tanh :: Floating a => Dimensionless a -> Dimensionless a asinh :: Floating a => Dimensionless a -> Dimensionless a acosh :: Floating a => Dimensionless a -> Dimensionless a atanh :: Floating a => Dimensionless a -> Dimensionless a -- | The standard two argument arctangent function. Since it interprets its -- two arguments in comparison with one another, the input may have any -- dimension. -- --
--   >>> atan2 _0 _1
--   0.0
--   
-- --
--   >>> atan2 _1 _0
--   1.5707963267948966
--   
-- --
--   >>> atan2 _0 (negate _1)
--   3.141592653589793
--   
-- --
--   >>> atan2 (negate _1) _0
--   -1.5707963267948966
--   
atan2 :: (RealFloat a) => Quantity d a -> Quantity d a -> Dimensionless a -- | Applies *~ to all values in a functor. (*~~) :: (Functor f, Num a) => f a -> Unit m d a -> f (Quantity d a) infixl 7 *~~ -- | Applies /~ to all values in a functor. (/~~) :: forall f m d a. (Functor f, Fractional a) => f (Quantity d a) -> Unit m d a -> f a infixl 7 /~~ -- | The sum of all elements in a foldable structure. -- --
--   >>> sum ([] :: [Mass Double])
--   0.0 kg
--   
-- --
--   >>> sum [12.4 *~ meter, 1 *~ foot]
--   12.7048 m
--   
sum :: (Num a, Foldable f) => f (Quantity d a) -> Quantity d a -- | The arithmetic mean of all elements in a foldable structure. -- --
--   >>> mean [pi, _7]
--   5.070796326794897
--   
mean :: (Fractional a, Foldable f) => f (Quantity d a) -> Quantity d a -- | The product of all elements in a foldable structure. -- --
--   >>> product ([] :: [Dimensionless Double])
--   1.0
--   
-- --
--   >>> product [pi, _4, 0.36 *~ one]
--   4.523893421169302
--   
product :: (Num a, Foldable f) => f (Dimensionless a) -> Dimensionless a -- | The length of the foldable data structure as a Dimensionless. -- This can be useful for purposes of e.g. calculating averages. -- --
--   >>> dimensionlessLength ["foo", "bar"]
--   2
--   
dimensionlessLength :: (Num a, Foldable f) => f b -> Dimensionless a -- | Returns a list of quantities between given bounds. -- --
--   n <= 0 ==> nFromTo (x :: Mass Double) (y :: Mass Double) n == [x, y]
--   
-- --
--   (x :: Length Double) <= (y :: Length Double) ==> all (\z -> x <= z && z <= y) (nFromTo x y n)
--   
-- --
--   >>> nFromTo _0 _3 2
--   [0.0,1.0,2.0,3.0]
--   
-- --
--   >>> nFromTo _1 _0 7
--   [1.0,0.875,0.75,0.625,0.5,0.375,0.25,0.125,0.0]
--   
-- --
--   >>> nFromTo _0 _1 (-5)
--   [0.0,1.0]
--   
nFromTo :: (Fractional a, Integral b) => Quantity d a -> Quantity d a -> b -> [Quantity d a] -- | The type-level dimension of dimensionless values. type DOne = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DLength = 'Dim 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DMass = 'Dim 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DTime = 'Dim 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero type DElectricCurrent = 'Dim 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero type DThermodynamicTemperature = 'Dim 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero type DAmountOfSubstance = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero type DLuminousIntensity = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 type Dimensionless = Quantity DOne type Length = Quantity DLength type Mass = Quantity DMass type Time = Quantity DTime type ElectricCurrent = Quantity DElectricCurrent type ThermodynamicTemperature = Quantity DThermodynamicTemperature type AmountOfSubstance = Quantity DAmountOfSubstance type LuminousIntensity = Quantity DLuminousIntensity -- | The constant for zero is polymorphic, allowing it to express zero -- Length or Capacitance or Velocity etc, in -- addition to the Dimensionless value zero. _0 :: Num a => Quantity d a _1 :: (Num a) => Dimensionless a _2 :: (Num a) => Dimensionless a _3 :: (Num a) => Dimensionless a _4 :: (Num a) => Dimensionless a _5 :: (Num a) => Dimensionless a _6 :: (Num a) => Dimensionless a _7 :: (Num a) => Dimensionless a _8 :: (Num a) => Dimensionless a _9 :: (Num a) => Dimensionless a pi :: Floating a => Dimensionless a -- | Twice pi. -- -- For background on tau see -- http://tauday.com/tau-manifesto (but also feel free to review -- http://www.thepimanifesto.com). tau :: Floating a => Dimensionless a -- | A polymorphic Unit which can be used in place of the coherent -- SI base unit of any dimension. This allows polymorphic quantity -- creation and destruction without exposing the Dimensional -- constructor. siUnit :: forall d a. (KnownDimension d, Num a) => Unit 'NonMetric d a -- | The unit one has dimension DOne and is the base unit of -- dimensionless values. -- -- As detailed in 7.10 "Values of quantities expressed simply as numbers: -- the unit one, symbol 1" of [1] the unit one generally does not -- appear in expressions. However, for us it is necessary to use -- one as we would any other unit to perform the "boxing" of -- dimensionless values. one :: Num a => Unit 'NonMetric DOne a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is -- irrational or Approximate. See mkUnitQ for when it is -- rational and mkUnitZ for when it is an integer. -- -- Note that supplying zero as a definining quantity is invalid, as the -- library relies upon units forming a group under multiplication. -- -- Supplying negative defining quantities is allowed and handled -- gracefully, but is discouraged on the grounds that it may be -- unexpected by other readers. mkUnitR :: Floating a => UnitName m -> ExactPi -> Unit m1 d a -> Unit m d a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is -- rational. See mkUnitZ for when it is an integer and -- mkUnitR for the general case. -- -- For more information see mkUnitR. mkUnitQ :: Fractional a => UnitName m -> Rational -> Unit m1 d a -> Unit m d a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is an -- integer. See mkUnitQ for when it is rational and mkUnitR -- for the general case. -- -- For more information see mkUnitR. mkUnitZ :: Num a => UnitName m -> Integer -> Unit m1 d a -> Unit m d a -- | Extracts the UnitName of a Unit. name :: Unit m d a -> UnitName m -- | Extracts the exact value of a Unit, expressed in terms of the -- SI coherent derived unit (see siUnit) of the same -- Dimension. -- -- Note that the actual value may in some cases be approximate, for -- example if the unit is defined by experiment. exactValue :: Unit m d a -> ExactPi -- | Discards potentially unwanted type level information about a -- Unit. weaken :: Unit m d a -> Unit 'NonMetric d a -- | Attempts to convert a Unit which may or may not be -- Metric to one which is certainly Metric. strengthen :: Unit m d a -> Maybe (Unit 'Metric d a) -- | Forms the exact version of a Unit. exactify :: Unit m d a -> Unit m d ExactPi -- | Shows the value of a Quantity expressed in a specified -- Unit of the same Dimension. -- --
--   >>> showIn watt $ (37 *~ volt) * (4 *~ ampere)
--   "148.0 W"
--   
showIn :: (Show a, Fractional a) => Unit m d a -> Quantity d a -> String -- | A KnownVariant is one whose term-level Dimensional values we -- can represent with an associated data family instance and manipulate -- with certain functions, not all of which are exported from the -- package. -- -- Each validly constructed type of kind Variant has a -- KnownVariant instance. class KnownVariant (v :: Variant) where { data family Dimensional v :: Dimension -> * -> *; } -- | Maps over the underlying representation of a dimensional value. The -- caller is responsible for ensuring that the supplied function respects -- the dimensional abstraction. This means that the function must -- preserve numerical values, or linearly scale them while preserving the -- origin. dmap :: KnownVariant v => (a1 -> a2) -> Dimensional v d a1 -> Dimensional v d a2 -- | Convenient conversion between numerical types while retaining -- dimensional information. -- --
--   >>> let x = (37 :: Rational) *~ poundMass
--   
--   >>> changeRep x :: Mass Double
--   16.78291769 kg
--   
changeRep :: (KnownVariant v, Real a, Fractional b) => Dimensional v d a -> Dimensional v d b -- | Convenient conversion from exactly represented values while retaining -- dimensional information. changeRepApproximate :: (KnownVariant v, Floating b) => Dimensional v d ExactPi -> Dimensional v d b -- | Converts a Unit into a lens from Quantitys to values. asLens :: (Fractional a) => Unit m d a -> (forall f. Functor f => (a -> f a) -> Quantity d a -> f (Quantity d a)) -- |

Summary

-- -- This module defines type synonyms for common dimensionalities and the -- associated quantity types. Additional dimensionalities and quantity -- types will be added on an as-needed basis. -- -- The definitions in this module are grouped so that a type synonym for -- the dimensionality is defined first in terms of base dimension -- exponents. Then a type synonym for the corresponding quantity type is -- defined. If there are several quantity types with the same -- dimensionality type synonyms are provided for each quantity type. -- --

References

-- --
    --
  1. http://physics.nist.gov/Pubs/SP811/
  2. --
module Numeric.Units.Dimensional.Quantities type Area = Quantity DArea type Volume = Quantity DVolume type Velocity = Quantity DVelocity type Acceleration = Quantity DAcceleration type WaveNumber = Quantity DWaveNumber type MassDensity = Quantity DMassDensity type Density = MassDensity type SpecificVolume = Quantity DSpecificVolume type CurrentDensity = Quantity DCurrentDensity type MagneticFieldStrength = Quantity DMagneticFieldStrength type AmountOfSubstanceConcentration = Quantity DAmountOfSubstanceConcentration type Concentration = AmountOfSubstanceConcentration type Luminance = Quantity DLuminance type PlaneAngle = Dimensionless type SolidAngle = Dimensionless type Frequency = Quantity DFrequency type Force = Quantity DForce type Pressure = Quantity DPressure type Stress = Quantity DStress type Energy = Quantity DEnergy type Work = Quantity DWork type QuantityOfHeat = Quantity DQuantityOfHeat type Power = Quantity DPower type RadiantFlux = Quantity DRadiantFlux type ElectricCharge = Quantity DElectricCharge type QuantityOfElectricity = Quantity DQuantityOfElectricity type ElectricPotential = Quantity DElectricPotential type PotentialDifference = Quantity DPotentialDifference type ElectromotiveForce = Quantity DElectromotiveForce type Capacitance = Quantity DCapacitance type ElectricResistance = Quantity DElectricResistance type ElectricConductance = Quantity DElectricConductance type MagneticFlux = Quantity DMagneticFlux type MagneticFluxDensity = Quantity DMagneticFluxDensity type Inductance = Quantity DInductance type LuminousFlux = Quantity DLuminousFlux type Illuminance = Quantity DIlluminance type CelsiusTemperature = Quantity DCelsiusTemperature type Activity = Quantity DActivity type AbsorbedDose = Quantity DAbsorbedDose type SpecificEnergy = Quantity DSpecificEnergy type Kerma = Quantity DKerma type DoseEquivalent = Quantity DDoseEquivalent type AmbientDoseEquivalent = DoseEquivalent type DirectionalDoseEquivalent = DoseEquivalent type PersonalDoseEquivalent = DoseEquivalent type EquivalentDose = DoseEquivalent type CatalyticActivity = Quantity DCatalyticActivity type AngularVelocity = Quantity DAngularVelocity type AngularAcceleration = Quantity DAngularAcceleration type DynamicViscosity = Quantity DDynamicViscosity type MomentOfForce = Quantity DMomentOfForce type SurfaceTension = Quantity DSurfaceTension type HeatFluxDensity = Quantity DHeatFluxDensity type Irradiance = Quantity DIrradiance type RadiantIntensity = Quantity DRadiantIntensity type Radiance = Quantity DRadiance type HeatCapacity = Quantity DHeatCapacity type Entropy = Quantity DEntropy type SpecificHeatCapacity = Quantity DSpecificHeatCapacity type SpecificEntropy = Quantity DSpecificEntropy type ThermalConductivity = Quantity DThermalConductivity type EnergyDensity = Quantity DEnergyDensity type ElectricFieldStrength = Quantity DElectricFieldStrength type ElectricChargeDensity = Quantity DElectricChargeDensity type ElectricFluxDensity = Quantity DElectricFluxDensity type Permittivity = Quantity DPermittivity type Permeability = Quantity DPermeability type MolarEnergy = Quantity DMolarEnergy type MolarEntropy = Quantity DMolarEntropy type MolarHeatCapacity = Quantity DMolarHeatCapacity type Exposure = Quantity DExposure type AbsorbedDoseRate = Quantity DAbsorbedDoseRate type Impulse = Quantity DImpulse type Momentum = Quantity DMomentum type MassFlow = Quantity DMassFlow type VolumeFlow = Quantity DVolumeFlow type GravitationalParameter = Quantity DGravitationalParameter type KinematicViscosity = Quantity DKinematicViscosity type FirstMassMoment = Quantity DFirstMassMoment type MomentOfInertia = Quantity DMomentOfInertia type AngularMomentum = Quantity DAngularMomentum type ThermalResistivity = Quantity DThermalResistivity type ThermalConductance = Quantity DThermalConductance type ThermalResistance = Quantity DThermalResistance type HeatTransferCoefficient = Quantity DHeatTransferCoefficient type ThermalAdmittance = HeatTransferCoefficient type ThermalInsulance = Quantity DThermalInsulance type Jerk = Quantity DJerk type Angle = PlaneAngle type Thrust = Force type Torque = MomentOfForce type EnergyPerUnitMass = SpecificEnergy -- | Constructs a unit of area from a unit of length, taking the area of a -- square whose sides are that length. -- --
--   >>> 64 *~ square meter == (8 *~ meter) ^ pos2
--   True
--   
square :: (Fractional a, Typeable m) => Unit m DLength a -> Unit 'NonMetric DArea a -- | Constructs a unit of volume from a unit of length, taking the volume -- of a cube whose sides are that length. -- --
--   >>> 64 *~ cubic meter == (4 *~ meter) ^ pos3
--   True
--   
cubic :: (Fractional a, Typeable m) => Unit m DLength a -> Unit 'NonMetric DVolume a type DArea = 'Dim 'Pos2 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DVolume = 'Dim 'Pos3 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DVelocity = 'Dim 'Pos1 'Zero 'Neg1 'Zero 'Zero 'Zero 'Zero type DAcceleration = 'Dim 'Pos1 'Zero 'Neg2 'Zero 'Zero 'Zero 'Zero type DWaveNumber = 'Dim 'Neg1 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DMassDensity = 'Dim 'Neg3 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DDensity = DMassDensity type DSpecificVolume = 'Dim 'Pos3 'Neg1 'Zero 'Zero 'Zero 'Zero 'Zero type DCurrentDensity = 'Dim 'Neg2 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero type DMagneticFieldStrength = 'Dim 'Neg1 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero type DAmountOfSubstanceConcentration = 'Dim 'Neg3 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero type DConcentration = DAmountOfSubstanceConcentration type DLuminance = 'Dim 'Neg2 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 type DPlaneAngle = DOne type DSolidAngle = DOne type DFrequency = 'Dim 'Zero 'Zero 'Neg1 'Zero 'Zero 'Zero 'Zero type DForce = 'Dim 'Pos1 'Pos1 'Neg2 'Zero 'Zero 'Zero 'Zero type DPressure = 'Dim 'Neg1 'Pos1 'Neg2 'Zero 'Zero 'Zero 'Zero type DStress = DPressure type DEnergy = 'Dim 'Pos2 'Pos1 'Neg2 'Zero 'Zero 'Zero 'Zero type DWork = DEnergy type DQuantityOfHeat = DEnergy type DPower = 'Dim 'Pos2 'Pos1 'Neg3 'Zero 'Zero 'Zero 'Zero type DRadiantFlux = DPower type DElectricCharge = 'Dim 'Zero 'Zero 'Pos1 'Pos1 'Zero 'Zero 'Zero type DQuantityOfElectricity = DElectricCharge type DElectricPotential = 'Dim 'Pos2 'Pos1 'Neg3 'Neg1 'Zero 'Zero 'Zero type DPotentialDifference = DElectricPotential type DElectromotiveForce = DElectricPotential type DCapacitance = 'Dim 'Neg2 'Neg1 'Pos4 'Pos2 'Zero 'Zero 'Zero type DElectricResistance = 'Dim 'Pos2 'Pos1 'Neg3 'Neg2 'Zero 'Zero 'Zero type DElectricConductance = 'Dim 'Neg2 'Neg1 'Pos3 'Pos2 'Zero 'Zero 'Zero type DMagneticFlux = 'Dim 'Pos2 'Pos1 'Neg2 'Neg1 'Zero 'Zero 'Zero type DMagneticFluxDensity = 'Dim 'Zero 'Pos1 'Neg2 'Neg1 'Zero 'Zero 'Zero type DInductance = 'Dim 'Pos2 'Pos1 'Neg2 'Neg2 'Zero 'Zero 'Zero type DLuminousFlux = DLuminousIntensity type DIlluminance = 'Dim 'Neg2 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 type DCelsiusTemperature = DThermodynamicTemperature type DActivity = DFrequency type DAbsorbedDose = 'Dim 'Pos2 'Zero 'Neg2 'Zero 'Zero 'Zero 'Zero type DSpecificEnergy = DAbsorbedDose type DKerma = DAbsorbedDose type DDoseEquivalent = DAbsorbedDose type DAmbientDoseEquivalent = DDoseEquivalent type DDirectionalDoseEquivalent = DDoseEquivalent type DPersonalDoseEquivalent = DDoseEquivalent type DEquivalentDose = DDoseEquivalent type DCatalyticActivity = 'Dim 'Zero 'Zero 'Neg1 'Zero 'Zero 'Pos1 'Zero type DAngularVelocity = DFrequency type DAngularAcceleration = 'Dim 'Zero 'Zero 'Neg2 'Zero 'Zero 'Zero 'Zero type DDynamicViscosity = 'Dim 'Neg1 'Pos1 'Neg1 'Zero 'Zero 'Zero 'Zero type DMomentOfForce = DEnergy type DSurfaceTension = 'Dim 'Zero 'Pos1 'Neg2 'Zero 'Zero 'Zero 'Zero type DHeatFluxDensity = 'Dim 'Zero 'Pos1 'Neg3 'Zero 'Zero 'Zero 'Zero type DIrradiance = DHeatFluxDensity type DRadiantIntensity = DPower type DRadiance = DIrradiance type DHeatCapacity = 'Dim 'Pos2 'Pos1 'Neg2 'Zero 'Neg1 'Zero 'Zero type DEntropy = DHeatCapacity type DSpecificHeatCapacity = 'Dim 'Pos2 'Zero 'Neg2 'Zero 'Neg1 'Zero 'Zero type DSpecificEntropy = DSpecificHeatCapacity type DThermalConductivity = 'Dim 'Pos1 'Pos1 'Neg3 'Zero 'Neg1 'Zero 'Zero type DEnergyDensity = DPressure type DElectricFieldStrength = 'Dim 'Pos1 'Pos1 'Neg3 'Neg1 'Zero 'Zero 'Zero type DElectricChargeDensity = 'Dim 'Neg3 'Zero 'Pos1 'Pos1 'Zero 'Zero 'Zero type DElectricFluxDensity = 'Dim 'Neg2 'Zero 'Pos1 'Pos1 'Zero 'Zero 'Zero type DPermittivity = 'Dim 'Neg3 'Neg1 'Pos4 'Pos2 'Zero 'Zero 'Zero type DPermeability = 'Dim 'Pos1 'Pos1 'Neg2 'Neg2 'Zero 'Zero 'Zero type DMolarEnergy = 'Dim 'Pos2 'Pos1 'Neg2 'Zero 'Zero 'Neg1 'Zero type DMolarEntropy = 'Dim 'Pos2 'Pos1 'Neg2 'Zero 'Neg1 'Neg1 'Zero type DMolarHeatCapacity = DMolarEntropy type DExposure = 'Dim 'Zero 'Neg1 'Pos1 'Pos1 'Zero 'Zero 'Zero type DAbsorbedDoseRate = 'Dim 'Pos2 'Zero 'Neg3 'Zero 'Zero 'Zero 'Zero type DImpulse = 'Dim 'Pos1 'Pos1 'Neg1 'Zero 'Zero 'Zero 'Zero type DMomentum = DImpulse type DMassFlow = 'Dim 'Zero 'Pos1 'Neg1 'Zero 'Zero 'Zero 'Zero type DVolumeFlow = 'Dim 'Pos3 'Zero 'Neg1 'Zero 'Zero 'Zero 'Zero type DGravitationalParameter = 'Dim 'Pos3 'Zero 'Neg2 'Zero 'Zero 'Zero 'Zero type DKinematicViscosity = 'Dim 'Pos2 'Zero 'Neg1 'Zero 'Zero 'Zero 'Zero type DFirstMassMoment = 'Dim 'Pos1 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DMomentOfInertia = 'Dim 'Pos2 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DAngularMomentum = 'Dim 'Pos2 'Pos1 'Neg1 'Zero 'Zero 'Zero 'Zero type DThermalResistivity = 'Dim 'Neg1 'Neg1 'Pos3 'Zero 'Pos1 'Zero 'Zero type DThermalConductance = 'Dim 'Pos2 'Pos1 'Neg3 'Zero 'Neg1 'Zero 'Zero type DThermalResistance = 'Dim 'Neg2 'Neg1 'Pos3 'Zero 'Pos1 'Zero 'Zero type DHeatTransferCoefficient = 'Dim 'Zero 'Pos1 'Neg3 'Zero 'Neg1 'Zero 'Zero type DThermalAdmittance = DHeatTransferCoefficient type DThermalInsulance = 'Dim 'Zero 'Neg1 'Pos3 'Zero 'Pos1 'Zero 'Zero type DJerk = 'Dim 'Pos1 'Zero 'Neg3 'Zero 'Zero 'Zero 'Zero type DAngle = DPlaneAngle type DThrust = DForce type DTorque = DMomentOfForce type DEnergyPerUnitMass = DSpecificEnergy -- |

Summary

-- -- This module defines the SI prefixes, the SI base units and the SI -- derived units. It also defines the units outside of the SI that are -- accepted for use with the SI. Any chapters, sections or tables -- referenced are from [1] unless otherwise specified. -- --

References

-- --
    --
  1. http://physics.nist.gov/Pubs/SP811/
  2. --
  3. http://en.wikipedia.org/wiki/Minute_of_arc
  4. --
  5. http://en.wikipedia.org/wiki/Astronomical_unit
  6. --
module Numeric.Units.Dimensional.SIUnits metre :: Num a => Unit 'Metric DLength a meter :: Num a => Unit 'Metric DLength a gram :: Fractional a => Unit 'Metric DMass a second :: Num a => Unit 'Metric DTime a ampere :: Num a => Unit 'Metric DElectricCurrent a kelvin :: Num a => Unit 'Metric DThermodynamicTemperature a mole :: Num a => Unit 'Metric DAmountOfSubstance a candela :: Num a => Unit 'Metric DLuminousIntensity a radian :: Num a => Unit 'Metric DPlaneAngle a steradian :: Num a => Unit 'Metric DSolidAngle a hertz :: Num a => Unit 'Metric DFrequency a newton :: Num a => Unit 'Metric DForce a pascal :: Num a => Unit 'Metric DPressure a joule :: Num a => Unit 'Metric DEnergy a watt :: Num a => Unit 'Metric DPower a coulomb :: Num a => Unit 'Metric DElectricCharge a volt :: Num a => Unit 'Metric DElectricPotential a farad :: Num a => Unit 'Metric DCapacitance a ohm :: Num a => Unit 'Metric DElectricResistance a siemens :: Num a => Unit 'Metric DElectricConductance a weber :: Num a => Unit 'Metric DMagneticFlux a tesla :: Num a => Unit 'Metric DMagneticFluxDensity a henry :: Num a => Unit 'Metric DInductance a lumen :: Num a => Unit 'Metric DLuminousFlux a lux :: Num a => Unit 'Metric DIlluminance a degreeCelsius :: Num a => Unit 'Metric DCelsiusTemperature a fromDegreeCelsiusAbsolute :: Floating a => a -> ThermodynamicTemperature a toDegreeCelsiusAbsolute :: Floating a => ThermodynamicTemperature a -> a becquerel :: Num a => Unit 'Metric DActivity a gray :: Num a => Unit 'Metric DAbsorbedDose a sievert :: Num a => Unit 'Metric DDoseEquivalent a katal :: Num a => Unit 'Metric DCatalyticActivity a minute :: Num a => Unit 'NonMetric DTime a hour :: Num a => Unit 'NonMetric DTime a day :: Num a => Unit 'NonMetric DTime a hectare :: Fractional a => Unit 'NonMetric DArea a litre :: Fractional a => Unit 'Metric DVolume a liter :: Fractional a => Unit 'Metric DVolume a tonne :: Num a => Unit 'Metric DMass a metricTon :: Num a => Unit 'Metric DMass a degree :: Floating a => Unit 'NonMetric DPlaneAngle a arcminute :: Floating a => Unit 'NonMetric DPlaneAngle a arcsecond :: Floating a => Unit 'NonMetric DPlaneAngle a degreeOfArc :: Floating a => Unit 'NonMetric DPlaneAngle a minuteOfArc :: Floating a => Unit 'NonMetric DPlaneAngle a secondOfArc :: Floating a => Unit 'NonMetric DPlaneAngle a astronomicalUnit :: Num a => Unit 'NonMetric DLength a deka :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a deca :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a hecto :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a kilo :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a mega :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a giga :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a tera :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a peta :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a exa :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a zetta :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a yotta :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a deci :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a centi :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a milli :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a micro :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a nano :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a pico :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a femto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a atto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a zepto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a yocto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a data Prefix applyPrefix :: (Fractional a) => Prefix -> Unit 'Metric d a -> Unit 'NonMetric d a -- | A list of all Prefixes defined by the SI. siPrefixes :: [Prefix] -- |

Summary

-- -- This module supplies a convenient set of imports for working with the -- dimensional package, including aliases for common Quantitys and -- Dimensions, and a comprehensive set of SI units and units -- accepted for use with the SI. -- -- It re-exports the Prelude, hiding arithmetic functions whose -- names collide with the dimensionally-typed versions supplied by this -- package. module Numeric.Units.Dimensional.Prelude -- |

Summary

-- -- This module defines units that are not part of the SI, with the -- exception of those defined in the -- Numeric.Units.Dimensional.SIUnits module (units outside of the -- SI accepted for use with the SI). -- -- Any chapters, sections or tables referenced are from [1] unless -- otherwise specified. -- --

Neper, bel, shannon and the like

-- -- The units of section 5.1.2 are purposefully (but not permanently) -- omitted. In fact the logarithmic units (see section 8.7) are -- problematic and it is not clear how to implement them. Perhaps with a -- conversion function similar to for degrees Celsius. -- --

References

-- --
    --
  1. http://physics.nist.gov/Pubs/SP811/
  2. -- --
  3. http://www.iau.org/science/publications/proceedings_rules/units/
  4. --
  5. http://en.m.wikipedia.org/wiki/Pressure
  6. --
  7. http://en.m.wikipedia.org/wiki/Torr
  8. --
module Numeric.Units.Dimensional.NonSI electronVolt :: Floating a => Unit 'Metric DEnergy a unifiedAtomicMassUnit :: Floating a => Unit 'Metric DMass a dalton :: Floating a => Unit 'Metric DMass a -- | One gee is the standard value of the acceleration due to gravity at -- the Earth's surface, as standardized by CIPM. -- -- Note that local values of acceleration due to gravity will differ from -- the standard gravity. -- -- See here for further information. -- --
--   >>> 1 *~ gee
--   9.80665 m s^-2
--   
-- --
--   >>> 1 *~ gee :: Acceleration Rational
--   196133 % 20000 m s^-2
--   
gee :: Fractional a => Unit 'Metric DAcceleration a -- | One avoirdupois pound is a mass, exactly defined in terms of the -- kilogram by the international yard and pound agreement of 1959. -- -- See here for further information. -- --
--   >>> 1 *~ poundMass
--   0.45359237 kg
--   
-- --
--   >>> 1 *~ poundMass :: Mass Rational
--   45359237 % 100000000 kg
--   
poundMass :: Fractional a => Unit 'NonMetric DMass a -- | One avoirdupois ounce is one sixteenth of a poundMass. -- -- See here for further information. -- --
--   >>> 1 *~ ounce
--   2.8349523125e-2 kg
--   
-- --
--   16 *~ ounce === 1 *~ poundMass
--   
-- --
--   >>> 1 *~ ounce :: Mass Rational
--   45359237 % 1600000000 kg
--   
ounce :: Fractional a => Unit 'NonMetric DMass a -- | The pound-force is equal to the gravitational force exerted on a mass -- of one avoirdupois pound on the surface of Earth. -- -- This definition is based on standard gravity (the gee) and the -- international avoirdupois poundMass. -- -- See here for further information. -- --
--   >>> 1 *~ poundForce
--   4.4482216152605 m kg s^-2
--   
-- --
--   1 *~ poundForce === 1 *~ poundMass * (1 *~ gee)
--   
-- --
--   >>> 1 *~ poundForce :: Force Rational
--   8896443230521 % 2000000000000 m kg s^-2
--   
poundForce :: Fractional a => Unit 'NonMetric DForce a -- | One mechanical horsepower is by definition the power necessary to -- apply a force of 550 poundForce through a distance of one -- foot per second. -- -- See here for further information. -- --
--   >>> 1 *~ horsepower
--   745.6998715822702 m^2 kg s^-3
--   
-- --
--   1 *~ horsepower === 550 *~ poundForce * (1 *~ foot) / (1 *~ second)
--   
-- --
--   >>> 1 *~ horsepower :: Power Rational
--   37284993579113511 % 50000000000000 m^2 kg s^-3
--   
horsepower :: Fractional a => Unit 'NonMetric DPower a -- | One btu is is the QuantityOfHeat required to raise the -- temperature of 1 avoirdupois poundMass of liquid water by 1 -- degreeFahrenheit at a constant pressure of one -- atmosphere. -- -- Because this value must be determined experimentally and varies with -- temperature, several standardized values of the btu have arisen. This -- is the value based on the International Steam Table calorie, defined -- by the Fifth International Conference on the Properties of Steam. -- -- See here for further information. -- --
--   >>> 1 *~ btu
--   1055.05585262 m^2 kg s^-2
--   
-- --
--   >>> 1 *~ btu :: Energy Rational
--   52752792631 % 50000000 m^2 kg s^-2
--   
btu :: Fractional a => Unit 'NonMetric DEnergy a -- | One short ton is two thousand poundMass. -- -- See here for further information. -- --
--   >>> 1 *~ shortTon
--   907.18474 kg
--   
-- --
--   >>> 1 *~ shortTon :: Mass Rational
--   45359237 % 50000 kg
--   
shortTon :: Fractional a => Unit 'NonMetric DMass a -- | One nautical mile is a unit of length, set by international agreement -- as being exactly 1 852 meters. -- -- Historically, it was defined as the distance spanned by one minute of -- arc along a meridian of the Earth. -- -- See here for further information. -- --
--   >>> 1 *~ nauticalMile
--   1852.0 m
--   
-- --
--   >>> 1 *~ nauticalMile :: Length Rational
--   1852 % 1 m
--   
nauticalMile :: (Num a) => Unit 'NonMetric DLength a -- | One knot is a velocity equal to one nauticalMile per -- hour. -- -- See here for further information. -- --
--   >>> 1 *~ knot
--   0.5144444444444445 m s^-1
--   
-- --
--   >>> 1 *~ knot :: Velocity Rational
--   463 % 900 m s^-1
--   
knot :: (Fractional a) => Unit 'NonMetric DVelocity a -- | One revolution is an angle equal to 2 pi radians; a full circle. -- -- See here for further information. -- --
--   >>> 1 *~ revolution
--   6.283185307179586
--   
-- --
--   1 *~ revolution === _2 * pi * (1 *~ radian)
--   
-- --
--   1 *~ revolution === 360 *~ degree
--   
revolution :: (Floating a) => Unit 'NonMetric DOne a solid :: (Floating a) => Unit 'NonMetric DOne a -- | The slug is a unit of mass associated with Imperial units and United -- States customary units. It is a mass that accelerates by 1 foot per -- second per second when a force of one pound is exerted on it. -- -- This definition is based on standard gravity (the gee), the -- international foot, and the international avoirdupois -- poundMass. -- -- See here for further information. -- --
--   >>> 1 *~ slug
--   14.593902937206364 kg
--   
-- --
--   >>> 1 *~ slug :: Mass Rational
--   8896443230521 % 609600000000 kg
--   
slug :: Fractional a => Unit 'NonMetric DMass a -- | One psi is a pressure of one poundForce per square -- inch of area. -- -- See here for further information. -- --
--   >>> 1 *~ psi
--   6894.757293168362 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ psi :: Pressure Rational
--   8896443230521 % 1290320000 m^-1 kg s^-2
--   
psi :: Fractional a => Unit 'NonMetric DPressure a teaspoon :: (Fractional a) => Unit 'NonMetric DVolume a -- | One international foot is one third of an international yard. -- -- See here for further information. -- --
--   >>> 1 *~ foot
--   0.3048 m
--   
-- --
--   3 *~ foot === 1 *~ yard
--   
-- --
--   >>> 1 *~ foot :: Length Rational
--   381 % 1250 m
--   
foot :: Fractional a => Unit 'NonMetric DLength a -- | One inch is one twelth of a foot. -- -- This inch is based on the international foot. -- -- See here for further information. -- --
--   >>> 1 *~ inch
--   2.54e-2 m
--   
-- --
--   12 *~ inch === 1 *~ foot
--   
-- --
--   >>> 1 *~ inch :: Length Rational
--   127 % 5000 m
--   
inch :: Fractional a => Unit 'NonMetric DLength a -- | One mil is one thousandth of an inch. -- -- This mil is based on the international inch. -- -- See here for further information. -- --
--   >>> 1 *~ mil
--   2.54e-5 m
--   
-- --
--   1000 *~ mil === 1 *~ inch
--   
-- --
--   >>> 1 *~ mil :: Length Rational
--   127 % 5000000 m
--   
mil :: Fractional a => Unit 'NonMetric DLength a -- | One yard, as defined by international agreement in 1959, is precisely -- 0.9144 meter. -- -- See here for further information. -- --
--   >>> 1 *~ yard
--   0.9144 m
--   
-- --
--   >>> 1 *~ yard :: Length Rational
--   1143 % 1250 m
--   
yard :: (Fractional a) => Unit 'NonMetric DLength a -- | One mile is 5 280 feet. -- -- This mile is based on the international foot. -- -- See here for further information. -- --
--   >>> 1 *~ mile
--   1609.344 m
--   
-- --
--   1 *~ mile === 5280 *~ foot
--   
-- --
--   >>> 1 *~ mile :: Length Rational
--   201168 % 125 m
--   
mile :: (Fractional a) => Unit 'NonMetric DLength a -- | One acre is 43 560 square feet. -- -- This acre is based on the international foot. For the acre -- based on the US Survey Foot, see usSurveyAcre. While both acres -- are in use, the difference between them is of little consequence for -- most applications in which either is used. -- -- See here for further information. -- --
--   >>> 1 *~ acre
--   4046.8564224 m^2
--   
-- --
--   1 *~ acre === 43560 *~ foot ^ pos2
--   
-- --
--   >>> 1 *~ acre :: Area Rational
--   316160658 % 78125 m^2
--   
acre :: (Fractional a) => Unit 'NonMetric DArea a -- | One US survey foot is 1200/3937 meter. -- -- For the international foot, see foot. Note that this is not the -- foot in routine use in the United States. -- -- See here for further information. -- --
--   >>> 1 *~ usSurveyFoot
--   0.3048006096012192 m
--   
-- --
--   >>> 1 *~ usSurveyFoot :: Length Rational
--   1200 % 3937 m
--   
usSurveyFoot :: Fractional a => Unit 'NonMetric DLength a -- | One inch is one twelth of a foot. -- -- This inch is based on the usSurveyFoot. For the inch based on -- the international foot, see inch. Note that this is not the -- inch in routine use in the United States. -- -- See here for further information. -- --
--   >>> 1 *~ usSurveyInch
--   2.54000508001016e-2 m
--   
-- --
--   12 *~ usSurveyInch === 1 *~ usSurveyFoot
--   
-- --
--   >>> 1 *~ usSurveyInch :: Length Rational
--   100 % 3937 m
--   
usSurveyInch :: Fractional a => Unit 'NonMetric DLength a -- | One mil is one thousandth of an inch. -- -- This mil is based on the usSurveyInch. For the mil based on the -- international inch, see mil. Note that this is not the mil in -- routine use in the United States. -- -- See here for further information. -- --
--   >>> 1 *~ usSurveyMil
--   2.54000508001016e-5 m
--   
-- --
--   1000 *~ usSurveyMil === 1 *~ usSurveyInch
--   
-- --
--   >>> 1 *~ usSurveyMil :: Length Rational
--   1 % 39370 m
--   
usSurveyMil :: Fractional a => Unit 'NonMetric DLength a -- | One yard is three feet. -- -- This yard is based on the usSurveyFoot. For the international -- yard, see yard. Note that this is not the yard in routine use -- in the United States. -- -- See here for further information. -- --
--   >>> 1 *~ usSurveyYard
--   0.9144018288036576 m
--   
-- --
--   1 *~ usSurveyYard === 3 *~ usSurveyFoot
--   
-- --
--   >>> 1 *~ usSurveyYard :: Length Rational
--   3600 % 3937 m
--   
usSurveyYard :: (Fractional a) => Unit 'NonMetric DLength a -- | One US survey mile is 5 280 US survey feet. -- -- This mile is based on the usSurveyFoot. For the mile based on -- the international foot, see mile. Note that this is not the -- mile in routine use in the United States. -- -- See here for further information. -- --
--   >>> 1 *~ usSurveyMile
--   1609.3472186944373 m
--   
-- --
--   1 *~ usSurveyMile === 5280 *~ usSurveyFoot
--   
-- --
--   >>> 1 *~ usSurveyMile :: Length Rational
--   6336000 % 3937 m
--   
usSurveyMile :: (Fractional a) => Unit 'NonMetric DLength a -- | One acre is 43 560 square feet. -- -- This acre is based on the usSurveyFoot. For the acre based on -- the international foot, see acre. While both acres are in use, -- the difference between them is of little consequence for most -- applications in which either is used. This is the only acre defined by -- the UCUM. -- -- See here for further information. -- --
--   >>> 1 *~ usSurveyAcre
--   4046.872609874252 m^2
--   
-- --
--   1 *~ usSurveyAcre === 43560 *~ usSurveyFoot ^ pos2
--   
-- --
--   >>> 1 *~ usSurveyAcre :: Area Rational
--   62726400000 % 15499969 m^2
--   
usSurveyAcre :: (Fractional a) => Unit 'NonMetric DArea a -- | One mean Julian year is a unit of measurement of time defined as -- exactly 365.25 days of 86 400 seconds each. -- -- See here for further information. -- --
--   >>> 1 *~ year
--   3.15576e7 s
--   
-- --
--   >>> 1 *~ year :: Time Rational
--   31557600 % 1 s
--   
year :: Num a => Unit 'NonMetric DTime a -- | One mean Julian century is one hundred mean Julian years. -- --
--   >>> 1 *~ century
--   3.15576e9 s
--   
-- --
--   >>> 1 *~ century :: Time Rational
--   3155760000 % 1 s
--   
century :: Num a => Unit 'NonMetric DTime a -- | The bar is exactly 100 000 pascal. -- -- From Wikipedia: -- -- It is about equal to the atmospheric pressure on Earth at sea level. -- --
--   >>> 1 *~ bar
--   100000.0 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ bar :: Pressure Rational
--   100000 % 1 m^-1 kg s^-2
--   
bar :: (Num a) => Unit 'Metric DPressure a -- | The "standard atmosphere". -- -- From Wikipedia [3]: -- -- The standard atmosphere (atm) is an established constant. It is -- approximately equal to typical air pressure at earth mean sea level. -- --
--   >>> 1 *~ atmosphere
--   101325.0 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ atmosphere :: Pressure Rational
--   101325 % 1 m^-1 kg s^-2
--   
atmosphere :: (Num a) => Unit 'NonMetric DPressure a -- | The "technical atmosphere" -- -- From Wikipedia: -- -- A technical atmosphere (symbol: at) is a non-SI unit of pressure equal -- to one kilogram-force per square centimeter. -- --
--   >>> 1 *~ technicalAtmosphere
--   98066.5 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ technicalAtmosphere :: Pressure Rational
--   196133 % 2 m^-1 kg s^-2
--   
technicalAtmosphere :: (Fractional a) => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 mm high column -- of mercury. -- -- Per Wikipedia [4], one mmHg (millimeter of mercury) is defined -- as: -- -- The pressure exerted at the base of a column of fluid exactly 1 mm -- high, when the density of the fluid is exactly 13.5951 g/cm^3, at a -- place where the acceleration of gravity is exactly 9.80665 m/s^2. -- -- The chosen fluid density approximately corresponds to that of mercury -- at 0 deg. Under most conditions, 1 mmHg is approximately equal to 1 -- torr. -- --
--   >>> 1 *~ mmHg
--   133.322 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ mmHg :: Pressure Rational
--   66661 % 500 m^-1 kg s^-2
--   
mmHg :: (Fractional a) => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 inch high -- column of mercury. -- -- Column inches of mercury are also used to measure pressure, especially -- in meteorological or aeronautical contexts in the United States. -- -- This is the value defined by UCUM. For the value defined by NIST, see -- inHg_NIST. -- --
--   >>> 1 *~ inHg
--   3386.3788 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ inHg :: Pressure Rational
--   8465947 % 2500 m^-1 kg s^-2
--   
inHg :: (Fractional a) => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 inch high -- column of mercury. -- -- Column inches of mercury are also used to measure pressure, especially -- in meteorological or aeronautical contexts in the United States. -- -- This is the value defined by UCUM. For the value defined by NIST, see -- inHg_NIST. -- --
--   >>> 1 *~ inHg_UCUM
--   3386.3788 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ inHg_UCUM :: Pressure Rational
--   8465947 % 2500 m^-1 kg s^-2
--   
inHg_UCUM :: (Fractional a) => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 inch high -- column of mercury. -- -- Column inches of mercury are also used to measure pressure, especially -- in meteorological or aeronautical contexts in the United States. -- -- This is the value defined by NIST. For the value defined by UCUM, see -- inHg_UCUM. -- --
--   >>> 1 *~ inHg_NIST
--   3386.389 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ inHg_NIST :: Pressure Rational
--   3386389 % 1000 m^-1 kg s^-2
--   
inHg_NIST :: (Fractional a) => Unit 'NonMetric DPressure a -- | One torr (symbol: Torr) is defined as 1/760 atmosphere, which -- is approximately equal to 1 mmHg. -- -- See here for further information. -- --
--   >>> 1 *~ torr
--   133.32236842105263 m^-1 kg s^-2
--   
-- --
--   >>> 1 *~ torr :: Pressure Rational
--   20265 % 152 m^-1 kg s^-2
--   
torr :: (Fractional a) => Unit 'NonMetric DPressure a -- | The rad is a deprecated unit of AbsorbedDose, defined as 0.01 -- gray. -- -- See here for further information. -- --
--   >>> 1 *~ rad
--   1.0e-2 m^2 s^-2
--   
-- --
--   >>> 1 *~ rad :: AbsorbedDose Rational
--   1 % 100 m^2 s^-2
--   
rad :: (Fractional a) => Unit 'Metric DAbsorbedDose a -- | One Stokes is a unit of KinematicViscosity equal to 1 cm^2 -- / s. -- -- See here for further information. -- --
--   >>> 1 *~ stokes
--   1.0e-4 m^2 s^-1
--   
-- --
--   >>> 1 *~ stokes :: KinematicViscosity Rational
--   1 % 10000 m^2 s^-1
--   
stokes :: (Fractional a) => Unit 'Metric DKinematicViscosity a -- | One degree Fahrenheit is a unit of relative temperature equal to 5/9 -- kelvin. -- -- Note that although the Fahrenheit scale is an absolute temperature -- scale, this unit is a unit of difference within that scale and -- measures relative temperature. -- -- See here for further information. -- --
--   >>> 1 *~ degreeFahrenheit
--   0.5555555555555556 K
--   
-- --
--   >>> 1 *~ degreeFahrenheit :: ThermodynamicTemperature Rational
--   5 % 9 K
--   
degreeFahrenheit :: (Fractional a) => Unit 'NonMetric DThermodynamicTemperature a -- | One degree Rankine is a unit of relative temperature equal to 5/9 -- kelvin. -- -- Note that although the Rankine scale is an absolute temperature scale, -- this unit is a unit of difference within that scale and measures -- relative temperature. -- -- See here for further information. -- --
--   >>> 1 *~ degreeRankine
--   0.5555555555555556 K
--   
-- --
--   >>> 1 *~ degreeRankine :: ThermodynamicTemperature Rational
--   5 % 9 K
--   
degreeRankine :: (Fractional a) => Unit 'NonMetric DThermodynamicTemperature a -- | One imperial gallon is defined exactly in terms of the liter by -- the Weights and Measures Act 1985. -- -- See here for further information. -- --
--   >>> 1 *~ imperialGallon
--   4.54609e-3 m^3
--   
-- --
--   >>> 1 *~ imperialGallon :: Volume Rational
--   454609 % 100000000 m^3
--   
imperialGallon :: (Fractional a) => Unit 'NonMetric DVolume a -- | One imperial quart is one quarter of an imperialGallon. -- -- See here for further information. -- --
--   >>> 1 *~ imperialQuart
--   1.1365225e-3 m^3
--   
-- --
--   >>> 1 *~ imperialQuart :: Volume Rational
--   454609 % 400000000 m^3
--   
imperialQuart :: (Fractional a) => Unit 'NonMetric DVolume a -- | One imperial pint is one half of an imperialQuart. -- -- See here for further information. -- --
--   >>> 1 *~ imperialPint
--   5.6826125e-4 m^3
--   
-- --
--   >>> 1 *~ imperialPint :: Volume Rational
--   454609 % 800000000 m^3
--   
imperialPint :: (Fractional a) => Unit 'NonMetric DVolume a -- | One imperial cup is one half of an imperialPint. -- -- This unit is not in common use and is does not appear in some sources -- describing the imperial fluid volume units. -- -- See here for further information. -- --
--   >>> 1 *~ imperialCup
--   2.84130625e-4 m^3
--   
-- --
--   >>> 1 *~ imperialCup :: Volume Rational
--   454609 % 1600000000 m^3
--   
imperialCup :: (Fractional a) => Unit 'NonMetric DVolume a -- | One imperial gill is one quarter of an imperialPint. -- -- See here for further information. -- --
--   >>> 1 *~ imperialGill
--   1.420653125e-4 m^3
--   
-- --
--   >>> 1 *~ imperialGill :: Volume Rational
--   454609 % 3200000000 m^3
--   
imperialGill :: (Fractional a) => Unit 'NonMetric DVolume a -- | One imperial fluid ounce is one twentieth of an imperialPint. -- -- See here for further information. -- --
--   >>> 1 *~ imperialFluidOunce
--   2.84130625e-5 m^3
--   
-- --
--   >>> 1 *~ imperialFluidOunce :: Volume Rational
--   454609 % 16000000000 m^3
--   
imperialFluidOunce :: (Fractional a) => Unit 'NonMetric DVolume a -- | One US liquid gallon is a volume of 231 cubic inches. -- -- See here for further information. -- --
--   >>> 1 *~ usGallon
--   3.785411784e-3 m^3
--   
-- --
--   >>> 1 *~ usGallon :: Volume Rational
--   473176473 % 125000000000 m^3
--   
usGallon :: (Fractional a) => Unit 'NonMetric DVolume a -- | One US liquid quart is one quarter of a usGallon. -- -- See here for further information. -- --
--   >>> 1 *~ usQuart
--   9.46352946e-4 m^3
--   
-- --
--   >>> 1 *~ usQuart :: Volume Rational
--   473176473 % 500000000000 m^3
--   
usQuart :: (Fractional a) => Unit 'NonMetric DVolume a -- | One US liquid pint is one half of a usQuart. -- -- See here for further information. -- --
--   >>> 1 *~ usPint
--   4.73176473e-4 m^3
--   
-- --
--   >>> 1 *~ usPint :: Volume Rational
--   473176473 % 1000000000000 m^3
--   
usPint :: (Fractional a) => Unit 'NonMetric DVolume a -- | One US liquid cup is one half of a usPint. -- -- See here for further information. -- --
--   >>> 1 *~ usCup
--   2.365882365e-4 m^3
--   
-- --
--   >>> 1 *~ usCup :: Volume Rational
--   473176473 % 2000000000000 m^3
--   
usCup :: (Fractional a) => Unit 'NonMetric DVolume a -- | One US liquid gill is one half of a usCup. -- -- See here for further information. -- --
--   >>> 1 *~ usGill
--   1.1829411825e-4 m^3
--   
-- --
--   >>> 1 *~ usGill :: Volume Rational
--   473176473 % 4000000000000 m^3
--   
usGill :: (Fractional a) => Unit 'NonMetric DVolume a -- | One US fluid ounce is 1128 usGallon or 18 usCup. -- -- See here for further information. -- --
--   >>> 1 *~ usFluidOunce
--   2.95735295625e-5 m^3
--   
-- --
--   >>> 1 *~ usFluidOunce :: Volume Rational
--   473176473 % 16000000000000 m^3
--   
usFluidOunce :: (Fractional a) => Unit 'NonMetric DVolume a -- | One Ångström is 1/10 nano meter. -- -- See here for further information. -- --
--   >>> 1 *~ angstrom
--   1.0e-10 m
--   
-- --
--   >>> 1 *~ angstrom :: Length Rational
--   1 % 10000000000 m
--   
angstrom :: (Fractional a) => Unit 'NonMetric DLength a -- | One Gauss is 1/10000 tesla. -- -- See here for further information. -- --
--   >>> 1 *~ gauss
--   1.0e-4 kg s^-2 A^-1
--   
-- --
--   >>> 1 *~ gauss :: MagneticFluxDensity Rational
--   1 % 10000 kg s^-2 A^-1
--   
gauss :: (Fractional a) => Unit 'NonMetric DMagneticFluxDensity a -- | Defines convenience functions for inspecting and manipulating -- quantities with RealFloat floating-point representations. -- -- The dimensionally-typed versions of functions from Patrick Perry's -- ieee754 package copy that package's API as closely as -- possible, by permission. In turn they are based on the tango -- math library for the D language. module Numeric.Units.Dimensional.Float -- | True if the representation of the argument is too small to be -- represented in normalized format. isDenormalized :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is an IEEE infinity -- or negative infinity. -- --
--   >>> isInfinite (_1 / _0)
--   True
--   
-- --
--   >>> isInfinite (42 *~ micro farad)
--   False
--   
isInfinite :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is an IEEE -- "not-a-number" (NaN) value. -- --
--   >>> isNaN _3
--   False
--   
-- --
--   >>> isNaN (_1 / _0)
--   False
--   
-- --
--   >>> isNaN (asin _4)
--   True
--   
isNaN :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is an IEEE negative -- zero. -- --
--   >>> isNegativeZero _0
--   False
--   
-- --
--   >>> isNegativeZero $ (-1e-200 *~ one) * (1e-200 *~ one)
--   True
--   
isNegativeZero :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is a number and is -- not infinite. -- --
--   >>> isFiniteNumber (_1 / _0)
--   False
--   
-- --
--   >>> isFiniteNumber (_0 / _0)
--   False
--   
-- --
--   >>> isFiniteNumber (_3 / _2)
--   True
--   
isFiniteNumber :: RealFloat a => Quantity d a -> Bool -- | Multiplies a floating-point quantity by an integer power of the radix -- of the representation type. -- -- Use floatRadix to determine the radix. -- --
--   >>> let x = 3 *~ meter
--   
--   >>> scaleFloat 3 x
--   24.0 m
--   
scaleFloat :: RealFloat a => Int -> Quantity d a -> Quantity d a -- | An infinite floating-point quantity. infinity :: IEEE a => Quantity d a -- | The smallest representable positive quantity whose representation is -- normalized. minNormal :: IEEE a => Quantity d a -- | The largest representable finite floating-point quantity. maxFinite :: IEEE a => Quantity d a -- | The smallest positive value x such that _1 + x is -- representable. epsilon :: IEEE a => Dimensionless a -- | Default NaN quantity. nan :: IEEE a => Quantity d a -- | Return the next smallest representable floating-point quantity -- (Infinity and NaN are unchanged). predIEEE :: IEEE a => Quantity d a -> Quantity d a -- | Return the next largest representable floating-point quantity -- (Infinity and NaN are unchanged). succIEEE :: IEEE a => Quantity d a -> Quantity d a -- | Given two floating-point quantities with the same sign, return the -- quantity whose representation is halfway between their representations -- on the IEEE number line. If the signs of the values differ or either -- is NaN, the value is undefined. bisectIEEE :: IEEE a => Quantity d a -> Quantity d a -> Quantity d a -- | copySign x y returns the quantity x with its sign -- changed to match that of y. copySign :: IEEE a => Quantity d a -> Quantity d a -> Quantity d a -- | Quiet NaN quantity with a positive integer payload. Payload -- must be less than maxNaNPayload of the representation type. -- -- Beware that while some platforms allow using 0 as a payload, this -- behavior is not portable. nanWithPayload :: IEEE a => Word64 -> Quantity d a -- | The payload stored in a NaN quantity. Undefined if the -- argument is not NaN. nanPayload :: IEEE a => Quantity d a -> Word64 -- | Maximum NaN payload for type a. maxNaNPayload :: IEEE a => a -> Word64 -- | Return True if two floating-point quantities are exactly -- (bitwise) equal. identicalIEEE :: IEEE a => Quantity d a -> Quantity d a -> Bool -- | Return the minimum of two quantities; if one value is NaN, -- return the other. Prefer the first if both values are NaN. minNum :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Return the maximum of two quantities; if one value is NaN, -- return the other. Prefer the first if both values are NaN. maxNum :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Return the minimum of two quantities; if one value is NaN, -- return it. Prefer the first if both values are NaN. minNaN :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Return the maximum of two quantities; if one value is NaN, -- return it. Prefer the first if both values are NaN. maxNaN :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Defines types for manipulation of quantities with fixed point -- representations. module Numeric.Units.Dimensional.FixedPoint -- | A unit of measurement. type Unit (m :: Metricality) = Dimensional ( 'DUnit m) -- | A dimensional quantity. type Quantity = SQuantity One -- | A dimensional quantity, stored as an ExactPi' multiple of its -- value in its dimension's SI coherent unit. -- -- The name is an abbreviation for scaled quantity. type SQuantity s = Dimensional ( 'DQuantity s) -- | Encodes whether a unit is a metric unit, that is, whether it can be -- combined with a metric prefix to form a related unit. data Metricality -- | Capable of receiving a metric prefix. Metric :: Metricality -- | Incapable of receiving a metric prefix. NonMetric :: Metricality -- | Represents a physical dimension in the basis of the 7 SI base -- dimensions, where the respective dimensions are represented by type -- variables using the following convention: -- -- -- -- For the equivalent term-level representation, see Dimension' data Dimension Dim :: TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> TypeInt -> Dimension -- | Multiplication of dimensions corresponds to adding of the base -- dimensions' exponents. -- | Division of dimensions corresponds to subtraction of the base -- dimensions' exponents. -- | Powers of dimensions corresponds to multiplication of the base -- dimensions' exponents by the exponent. -- -- We limit ourselves to integer powers of Dimensionals as fractional -- powers make little physical sense. -- | Roots of dimensions corresponds to division of the base dimensions' -- exponents by the order of the root. -- | The reciprocal of a dimension is defined as the result of dividing -- DOne by it, or of negating each of the base dimensions' -- exponents. type Recip (d :: Dimension) = DOne / d -- | A physical dimension, encoded as 7 integers, representing a -- factorization of the dimension into the 7 SI base dimensions. By -- convention they are stored in the same order as in the -- Dimension data kind. data Dimension' Dim' :: !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> Dimension' -- | Dimensional values inhabit this class, which allows access to a -- term-level representation of their dimension. class HasDynamicDimension a => HasDimension a -- | Obtains a term-level representation of a value's dimension. dimension :: HasDimension a => a -> Dimension' -- | A KnownDimension is one for which we can construct a term-level -- representation. Each validly constructed type of kind Dimension -- has a KnownDimension instance. -- -- While KnownDimension is a constraint synonym, the presence of -- KnownDimension d in a context allows use of -- dimension :: Proxy d -> Dimension'. type KnownDimension (d :: Dimension) = HasDimension (Proxy d) -- | Forms a possibly scaled SQuantity by multipliying a number and -- a unit. (*~) :: forall s m d a b. (RealFrac a, Integral b, MinCtxt s a) => a -> Unit m d a -> SQuantity s d b infixl 7 *~ -- | Divides a possibly scaled SQuantity by a Unit of the -- same physical dimension, obtaining the numerical value of the quantity -- expressed in that unit. (/~) :: forall s m d a b. (Real a, Fractional b, MinCtxt s b) => SQuantity s d a -> Unit m d b -> b infixl 7 /~ -- | Multiplies two Quantitys or two Units. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NonMetric. (*) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 * v2), Num a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a infixl 7 * -- | Divides one Quantity by another or one Unit by another. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NotPrefixable. (/) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 / v2), Fractional a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 / v2) (d1 / d2) a infixl 7 / -- | Adds two possibly scaled SQuantitys, preserving any scale -- factor. -- -- Use in conjunction with changeRepRound to combine quantities -- with differing scale factors. (+) :: (Num a) => SQuantity s d a -> SQuantity s d a -> SQuantity s d a infixl 6 + -- | Subtracts one possibly scaled SQuantity from another, -- preserving any scale factor. -- -- Use in conjunction with changeRepRound to combine quantities -- with differing scale factors. (-) :: (Num a) => SQuantity s d a -> SQuantity s d a -> SQuantity s d a infixl 6 - -- | Negates the value of a possibly scaled SQuantity, preserving -- any scale factor. negate :: (Num a) => SQuantity s d a -> SQuantity s d a -- | Takes the absolute value of a possibly scaled SQuantity, -- preserving any scale factor. abs :: (Num a) => SQuantity s d a -> SQuantity s d a expD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b logD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b sinD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b cosD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b tanD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b asinD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b acosD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b atanD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b sinhD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b coshD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b tanhD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b asinhD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b acoshD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b atanhD :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne b -- | The standard two argument arctangent function. Since it interprets its -- two arguments in comparison with one another, the input may have any -- dimension. atan2D :: (Integral a, Integral b, MinCtxt s1 Double, MinCtxt s2 Double, MinCtxt s3 Double) => SQuantity s1 DOne a -> SQuantity s2 DOne a -> SQuantity s3 DOne b expVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c logVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c sinVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c cosVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c tanVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c asinVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c acosVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c atanVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c sinhVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c coshVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c tanhVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c asinhVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c acoshVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c atanhVia :: (Integral a, RealFrac b, Floating b, Integral c, MinCtxt s1 b, MinCtxt s2 b) => Proxy b -> SQuantity s1 DOne a -> SQuantity s2 DOne c -- | The standard two argument arctangent function. Since it interprets its -- two arguments in comparison with one another, the input may have any -- dimension. atan2Via :: forall s1 s2 s3 a b c d. (Integral a, RealFloat b, Integral c, MinCtxt s1 b, MinCtxt s2 b, MinCtxt s3 b, KnownDimension d) => Proxy b -> SQuantity s1 d a -> SQuantity s2 d a -> SQuantity s3 DOne c -- | Applies *~ to all values in a functor. (*~~) :: (Functor f, RealFrac a, Integral b, MinCtxt s a) => f a -> Unit m d a -> f (SQuantity s d b) infixl 7 *~~ -- | Applies /~ to all values in a functor. (/~~) :: (Functor f, Real a, Fractional b, MinCtxt s b) => f (SQuantity s d a) -> Unit m d b -> f b infixl 7 /~~ -- | The sum of all elements in a list. sum :: (Num a, Foldable f) => f (SQuantity s d a) -> SQuantity s d a -- | The arithmetic mean of all elements in a list. mean :: (Fractional a, Foldable f) => f (SQuantity s d a) -> SQuantity s d a -- | Rescales a fixed point quantity, accomodating changes both in its -- scale factor and its representation type. -- -- Note that this uses an arbitrary precision representation of -- pi, which may be quite slow. rescale :: forall a b d s1 s2. (Integral a, Integral b, KnownExactPi s1, KnownExactPi s2) => SQuantity s1 d a -> SQuantity s2 d b -- | Rescales a fixed point quantity, accomodating changes both in its -- scale factor and its representation type. -- -- Expected to outperform rescale when a FiniteBits context -- is available for the source and destination representation types. rescaleFinite :: (Integral a, FiniteBits a, Integral b, FiniteBits b, KnownExactPi s1, KnownExactPi s2) => SQuantity s1 d a -> SQuantity s2 d b -- | Approximately rescales a fixed point quantity, accomodating changes -- both in its scale factor and its representation type. -- -- Uses approximate arithmetic by way of an intermediate Double -- representation. rescaleD :: (Integral a, Integral b, KnownExactPi s1, KnownExactPi s2) => SQuantity s1 d a -> SQuantity s2 d b -- | Approximately rescales a fixed point quantity, accomodating changes -- both in its scale factor and its representation type. -- -- Uses approximate arithmetic by way of an intermediate Floating -- type, to which a proxy must be supplied. rescaleVia :: forall a b c d s1 s2. (Integral a, RealFrac b, Floating b, Integral c, KnownExactPi s1, KnownExactPi s2) => Proxy b -> SQuantity s1 d a -> SQuantity s2 d c -- | A KnownVariant is one whose term-level Dimensional values we -- can represent with an associated data family instance and manipulate -- with certain functions, not all of which are exported from the -- package. -- -- Each validly constructed type of kind Variant has a -- KnownVariant instance. class KnownVariant (v :: Variant) where { data family Dimensional v :: Dimension -> * -> *; } -- | Maps over the underlying representation of a dimensional value. The -- caller is responsible for ensuring that the supplied function respects -- the dimensional abstraction. This means that the function must -- preserve numerical values, or linearly scale them while preserving the -- origin. dmap :: KnownVariant v => (a1 -> a2) -> Dimensional v d a1 -> Dimensional v d a2 -- | Convenient conversion between numerical types while retaining -- dimensional information. changeRep :: forall v1 v2 d a b. (KnownVariant v1, KnownVariant v2, CompatibleVariants v1 v2, MinCtxt (ScaleFactor v1 / ScaleFactor v2) b, Real a, Fractional b) => Dimensional v1 d a -> Dimensional v2 d b -- | Convenient conversion to types with Integral representations -- using round. changeRepRound :: forall v1 v2 d a b. (KnownVariant v1, KnownVariant v2, CompatibleVariants v1 v2, MinCtxt (ScaleFactor v1 / ScaleFactor v2) a, RealFrac a, Integral b) => Dimensional v1 d a -> Dimensional v2 d b -- | Convenient conversion from exactly represented values while retaining -- dimensional information. changeRepApproximate :: (KnownVariant v, Floating b) => Dimensional v d ExactPi -> Dimensional v d b -- | The type-level dimension of dimensionless values. type DOne = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DLength = 'Dim 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DMass = 'Dim 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DTime = 'Dim 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero type DElectricCurrent = 'Dim 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero type DThermodynamicTemperature = 'Dim 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero type DAmountOfSubstance = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero type DLuminousIntensity = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 type Dimensionless = Quantity DOne type Length = Quantity DLength type Mass = Quantity DMass type Time = Quantity DTime type ElectricCurrent = Quantity DElectricCurrent type ThermodynamicTemperature = Quantity DThermodynamicTemperature type AmountOfSubstance = Quantity DAmountOfSubstance type LuminousIntensity = Quantity DLuminousIntensity -- | The constant for zero is polymorphic, allowing it to express zero -- Length or Capacitance or Velocity etc, in -- addition to the Dimensionless value zero. _0 :: Num a => SQuantity s d a -- | The least positive representable value in a given fixed-point scaled -- quantity type. epsilon :: (Integral a) => SQuantity s d a _1 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _2 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _3 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _4 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _5 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _6 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _7 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _8 :: (Integral a, KnownExactPi s) => SQuantity s DOne a _9 :: (Integral a, KnownExactPi s) => SQuantity s DOne a pi :: (Integral a, KnownExactPi s) => SQuantity s DOne a -- | Twice pi. -- -- For background on tau see -- http://tauday.com/tau-manifesto (but also feel free to review -- http://www.thepimanifesto.com). tau :: (Integral a, KnownExactPi s) => SQuantity s DOne a -- | A polymorphic Unit which can be used in place of the coherent -- SI base unit of any dimension. This allows polymorphic quantity -- creation and destruction without exposing the Dimensional -- constructor. siUnit :: forall d a. (KnownDimension d, Num a) => Unit 'NonMetric d a -- | The unit one has dimension DOne and is the base unit of -- dimensionless values. -- -- As detailed in 7.10 "Values of quantities expressed simply as numbers: -- the unit one, symbol 1" of [1] the unit one generally does not -- appear in expressions. However, for us it is necessary to use -- one as we would any other unit to perform the "boxing" of -- dimensionless values. one :: Num a => Unit 'NonMetric DOne a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is -- irrational or Approximate. See mkUnitQ for when it is -- rational and mkUnitZ for when it is an integer. -- -- Note that supplying zero as a definining quantity is invalid, as the -- library relies upon units forming a group under multiplication. -- -- Supplying negative defining quantities is allowed and handled -- gracefully, but is discouraged on the grounds that it may be -- unexpected by other readers. mkUnitR :: Floating a => UnitName m -> ExactPi -> Unit m1 d a -> Unit m d a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is -- rational. See mkUnitZ for when it is an integer and -- mkUnitR for the general case. -- -- For more information see mkUnitR. mkUnitQ :: Fractional a => UnitName m -> Rational -> Unit m1 d a -> Unit m d a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is an -- integer. See mkUnitQ for when it is rational and mkUnitR -- for the general case. -- -- For more information see mkUnitR. mkUnitZ :: Num a => UnitName m -> Integer -> Unit m1 d a -> Unit m d a -- | Extracts the UnitName of a Unit. name :: Unit m d a -> UnitName m -- | Extracts the exact value of a Unit, expressed in terms of the -- SI coherent derived unit (see siUnit) of the same -- Dimension. -- -- Note that the actual value may in some cases be approximate, for -- example if the unit is defined by experiment. exactValue :: Unit m d a -> ExactPi -- | Discards potentially unwanted type level information about a -- Unit. weaken :: Unit m d a -> Unit 'NonMetric d a -- | Attempts to convert a Unit which may or may not be -- Metric to one which is certainly Metric. strengthen :: Unit m d a -> Maybe (Unit 'Metric d a) -- | Forms the exact version of a Unit. exactify :: Unit m d a -> Unit m d ExactPi -- | A dimensionless number with n fractional bits, using a -- representation of type a. type Q n a = SQuantity (QScale n) DOne a -- | A binary scale factor. type QScale n = (One / (ExactNatural (2 ^ n))) -- | A single-turn angle represented as a signed 8-bit integer. type Angle8 = SQuantity (Pi * (QScale 7)) DPlaneAngle Int8 -- | A single-turn angle represented as a signed 16-bit integer. type Angle16 = SQuantity (Pi * (QScale 15)) DPlaneAngle Int16 -- | A single-turn angle represented as a signed 32-bit integer. type Angle32 = SQuantity (Pi * (QScale 31)) DPlaneAngle Int32 -- | Provides a Functor instance for Dimensional. -- -- Note that this instance is dubious, because it allows you to break the -- dimensional abstraction. See dmap for more information. -- -- Note that, while this instance overlaps with that given for -- Dimensionless, it is confluent with that instance. -- -- Note that this is an orphan instance. module Numeric.Units.Dimensional.Functor -- | A Functor instance for Dimensional. -- -- Note that this instance is dubious, because it allows you to break the -- dimensional abstraction. See dmap for more information. -- -- Note that, while this instance overlaps with that given for -- Dimensionless, it is confluent with that instance. -- -- Note that this is an orphan instance. instance Numeric.Units.Dimensional.Internal.KnownVariant v => GHC.Base.Functor (Numeric.Units.Dimensional.Internal.Dimensional v d) -- | Defines types for manipulation of units and quantities without phantom -- types for their dimensions. module Numeric.Units.Dimensional.Dynamic -- | A Quantity whose Dimension is only known dynamically. data AnyQuantity a -- | Possibly a Quantity whose Dimension is only known -- dynamically. -- -- By modeling the absence of a value, this type differs from -- AnyQuantity in that it may not be a Quantity of any -- Dimension whatsoever, but in exchange it gains instances for -- the common numeric classes. It's therefore useful for manipulating, -- and not merely storing, quantities of unknown dimension. -- -- This type also contains a polydimensionalZero, representing -- zero value of any dimension. -- -- Note that the Eq instance for DynQuantity equates all -- representations of an invalid value, and also does not equate -- polydimensional zero with zero of any specific dimension. data DynQuantity a -- | The class of types that can be used to model Quantitys that are -- certain to have a value with some dimension. class Demotable (q :: * -> *) -- | The class of types that can be used to model Quantitys whose -- Dimensions are only known dynamically. class Promotable (q :: * -> *) -- | Dimensional values, or those that are only possibly dimensional, -- inhabit this class, which allows access to a term-level representation -- of their dimension. class HasDynamicDimension a -- | Gets the 'DynamicDimension of a dynamic dimensional value, which may -- be NoDimension if it does not represent a dimensional value of -- any Dimension. -- -- A default implementation is available for types that are also in the -- HasDimension typeclass. dynamicDimension :: HasDynamicDimension a => a -> DynamicDimension -- | Gets the 'DynamicDimension of a dynamic dimensional value, which may -- be NoDimension if it does not represent a dimensional value of -- any Dimension. -- -- A default implementation is available for types that are also in the -- HasDimension typeclass. dynamicDimension :: (HasDynamicDimension a, (HasDimension a)) => a -> DynamicDimension -- | The dimension of a dynamic value, which may not have any dimension at -- all. data DynamicDimension -- | The value has no valid dimension. NoDimension :: DynamicDimension -- | The value has the given dimension. SomeDimension :: Dimension' -> DynamicDimension -- | The value may be interpreted as having any dimension. AnyDimension :: DynamicDimension -- | Converts a dynamic quantity such as an AnyQuantity or a -- DynQuantity into a Quantity, or to Nothing if the -- dynamic quantity cannot be represented in the narrower result type. promoteQuantity :: forall a d q. (Promotable q, KnownDimension d) => q a -> Maybe (Quantity d a) -- | Forgets information about a Quantity or AnyQuantity, -- yielding an AnyQuantity or a DynQuantity. demoteQuantity :: (Demotable q, Promotable d) => q a -> d a -- | Forms a dynamic quantity by multipliying a number and a dynamic unit. (*~) :: (Floating a, Promotable q) => a -> AnyUnit -> q a -- | Divides a dynamic quantity by a dynamic unit, obtaining the numerical -- value of the quantity expressed in that unit if they are of the same -- physical dimension, or Nothing otherwise. (/~) :: (Floating a, Promotable q) => q a -> AnyUnit -> Maybe a -- | A DynQuantity which does not correspond to a value of any -- dimension. invalidQuantity :: DynQuantity a -- | A DynQuantity which corresponds to zero value of any dimension. -- -- When combined through arithmetic with other DynQuantitys, -- inference is performed. For example, adding a length to -- polydimensional zero produces that length. Adding two polydimensional -- zeros produces another. Taking the sine of a polydimensional zero -- interprets it as a dimensionless zero and produces a dimensionless -- result. -- -- Note that division by polydimensionalZero produces a -- polydimensional result, which may be an error or some representation -- of infinity, as determined by the underlying arithmetic type. This -- behavior was chosen for consistency with the behavior of division by -- zero DynQuantitys of a specific dimension. polydimensionalZero :: (Num a) => DynQuantity a -- | A Unit whose Dimension is only known dynamically. data AnyUnit -- | Converts a Unit of statically known Dimension into an -- AnyUnit. demoteUnit :: forall m d a. (KnownDimension d) => Unit m d a -> AnyUnit -- | Converts an AnyUnit into a Unit of statically known -- Dimension, or Nothing if the dimension does not match. -- -- The result is represented in ExactPi, conversion to other -- representations is possible using changeRepApproximate. -- -- The result is always tagged as NonMetric, conversion to a -- Metric unit can be attempted using strengthen. promoteUnit :: forall d. (KnownDimension d) => AnyUnit -> Maybe (Unit 'NonMetric d ExactPi) -- | Converts a Unit of statically known Dimension into an -- AnyUnit. -- -- This is the same as the more general demoteUnit but is useful -- in certain circumstances to avoid needlessly introducing an ambiguous -- type variable. demoteUnit' :: (KnownDimension d) => Unit m d ExactPi -> AnyUnit -- | The dynamic SI coherent unit of a given dimension. siUnit :: Dimension' -> AnyUnit anyUnitName :: AnyUnit -> UnitName 'NonMetric -- | Forms the product of two dynamic units. (*) :: AnyUnit -> AnyUnit -> AnyUnit -- | Forms the quotient of two dynamic units. (/) :: AnyUnit -> AnyUnit -> AnyUnit -- | Raises a dynamic unit to an integer power. (^) :: (Integral a) => AnyUnit -> a -> AnyUnit -- | Forms the reciprocal of a dynamic unit. recip :: AnyUnit -> AnyUnit -- | Applies a prefix to a dynamic unit. Returns Nothing if the -- Unit was NonMetric and thus could not accept a prefix. applyPrefix :: Prefix -> AnyUnit -> Maybe AnyUnit instance GHC.Generics.Generic Numeric.Units.Dimensional.Dynamic.AnyUnit instance GHC.Generics.Generic1 Numeric.Units.Dimensional.Dynamic.DynQuantity instance GHC.Generics.Generic (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance Data.Data.Data a => Data.Data.Data (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Generics.Generic1 Numeric.Units.Dimensional.Dynamic.AnyQuantity instance GHC.Generics.Generic (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance Data.Data.Data a => Data.Data.Data (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance GHC.Show.Show Numeric.Units.Dimensional.Dynamic.AnyUnit instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension Numeric.Units.Dimensional.Dynamic.AnyUnit instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDimension Numeric.Units.Dimensional.Dynamic.AnyUnit instance Numeric.Units.Dimensional.UnitNames.InterchangeNames.HasInterchangeName Numeric.Units.Dimensional.Dynamic.AnyUnit instance Data.Semigroup.Semigroup Numeric.Units.Dimensional.Dynamic.AnyUnit instance GHC.Base.Monoid Numeric.Units.Dimensional.Dynamic.AnyUnit instance Numeric.Units.Dimensional.Dynamic.Promotable Numeric.Units.Dimensional.Dynamic.AnyQuantity instance Numeric.Units.Dimensional.Dynamic.Promotable Numeric.Units.Dimensional.Dynamic.DynQuantity instance GHC.Classes.Eq a => GHC.Classes.Eq (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Show.Show a => GHC.Show.Show (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Num.Num a => GHC.Num.Num (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Real.Fractional a => GHC.Real.Fractional (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Float.Floating a => GHC.Float.Floating (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Num.Num a => Data.Semigroup.Semigroup (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance GHC.Num.Num a => GHC.Base.Monoid (Numeric.Units.Dimensional.Dynamic.DynQuantity a) instance Numeric.Units.Dimensional.Dimensions.TypeLevel.KnownDimension d => Numeric.Units.Dimensional.Dynamic.Demotable (Numeric.Units.Dimensional.Internal.Quantity d) instance Numeric.Units.Dimensional.Dynamic.Demotable Numeric.Units.Dimensional.Dynamic.AnyQuantity instance GHC.Show.Show a => GHC.Show.Show (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDimension (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance GHC.Num.Num a => Data.Semigroup.Semigroup (Numeric.Units.Dimensional.Dynamic.AnyQuantity a) instance GHC.Num.Num a => GHC.Base.Monoid (Numeric.Units.Dimensional.Dynamic.AnyQuantity a)