-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Simple arithmetic with SI units using type-checked dimensional analysis. -- -- Please see the README on GitHub at -- https://github.com/groscoe/simple-units#readme @package simple-units @version 1.0.2 module Units.Simple -- | A numerical quantity with some associated unit. Units are not created -- directly with this constructor, but through the individual unit -- functions. -- -- Examples: -- --
-- >>> import Units.Simple -- -- >>> meter -- a unitary quantity associated to meters. -- 1 m -- -- >>> 2.5*ampere -- constructing through literal arithmetic -- 2.5 A -- -- >>> candela' 3.14 -- constructing through the unit constructors -- 3.14 cd -- -- >>> :set -XDataKinds -- -- >>> 2 :: Quantity (SingleUnit 'Second) Rational -- 2 % 1 s ---- -- Associated units are represented through a phantom parameter of the -- Units kind synonym. These are currently implemented as a -- type-level pair of lists representing the power to which each unit is -- raised. Units can be inspected through showUnits. -- -- New constructors may be written by combining the provided ones, such -- as -- --
-- >>> let newton = kilogram .* meter ./ (second .* second) -- -- >>> 23*newton -- 23.0 kg*m/s^2 -- -- -- >>> let g = 6.67408e-11 * newton .* (meter .* meter) ./ (kilogram .* kilogram) -- -- >>> g -- gravitational constant -- 6.67408e-11 m^3/kg*s^2 -- -- >>> let gravity m1 m2 r = g .* (m1 * kilogram) .* (m2 * kilogram) ./ (r*meter .* r*meter) -- -- >>> let earth_mass = 5.972e24 * kilo gram -- -- >>> let mars_mass = 6.417e23 * kilo gram -- -- >>> let earth_radius = 6371 * kilo meter -- -- >>> let mars_radius = 3389.5 * kilo meter -- -- >>> let weight_on_earth mass = gravity mass earth_mass earth_radius -- -- >>> let weight_on_mars mass = gravity mass mars_mass mars_radius -- -- >>> weight_on_earth (80 * kilo gram) -- 785.5719790179963 kg*m/s^2 -- -- >>> weight_on_mars (80 * kilo gram) -- 298.22370259533704 kg*m/s^2 -- -- >>> weight_on_mars 1 / weight_on_earth 1 -- 0.3796261966575378 <adimensional> --data Quantity (us :: Units) a -- | Unwraps a Quantity, losing all unit information fromQuantity :: Quantity us a -> a data Unit Meter :: Unit Kilogram :: Unit Second :: Unit Ampere :: Unit Kelvin :: Unit Mole :: Unit Candela :: Unit type Units = ([Unit'], [Unit']) type SingleUnit (u :: Unit) = '('['(u, 1)], '[]) type UnitRepr (us :: Units) = UnitRepr' (Eval (Fst us)) (Eval (Snd us)) -- | A string representation of Units. Useful for debugging. showUnits :: forall us. KnownSymbol (UnitRepr us) => String -- | Sums two quantities with the same units. Summing quantities with -- different units results in a type error. -- -- Examples: -- --
-- >>> import Units.Simple -- -- >>> 2 * kilo meter .+ 3 * kilo meter -- 5000 m -- -- >>> 2*meter .+ 1*second -- -- <interactive>... error: -- • Unit mismatch: m and s -- • In the expression: 2 * meter .+ 1 * second -- In an equation for ‘it’: it = 2 * meter .+ 1 * second --(.+) :: (SameUnits u1 u2, Num a) => Quantity u1 a -> Quantity u2 a -> Quantity u1 a infixl 5 .+ -- | Subtracts two quantities with the same units. Subtracting quantities -- with different units results in a type error. -- -- Examples: -- --
-- >>> import Units.Simple -- -- >>> let newton = kilogram .* meter ./ (second .* second) -- -- >>> 10*newton - 2*newton -- 8.0 kg*m/s^2 --(.-) :: (SameUnits u1 u2, Num a) => Quantity u1 a -> Quantity u2 a -> Quantity u1 a infixl 5 .- -- | Multiplies two quantities correctly merging their units. -- -- Examples: -- --
-- >>> import Units.Simple -- -- >>> meter .* meter -- 1 m^2 -- -- >>> let mps = meter ./ second -- -- >>> 20*mps .* 60*second -- 1200.0 m ---- -- Important: Though Quantity a has a Num -- instance for convenience, it must not be used for anything -- other than interacting with literals, otherwise the units will -- not be correct: -- --
-- >>> 2*meter * 3*meter -- note that (*) was used in place of (.*) -- 6 m -- -- >>> 2*meter .* 3*meter -- this is the correct usage -- 6 m^2 --(.*) :: Num a => Quantity us1 a -> Quantity us2 a -> Quantity (MergeUnits us1 us2) a infixl 6 .* -- | Divides a quantity by another correctly merging their units. -- -- Examples: -- --
-- >>> import Units.Simple -- -- >>> let coulomb = second .* ampere -- -- >>> 20*coulomb ./ 2*second -- 10.0 A --(./) :: Fractional a => Quantity us1 a -> Quantity us2 a -> Quantity (MergeUnits us1 (Recip us2)) a infixl 6 ./ -- | A Quantity with no associated dimension. Can be multiplied or -- divided by any other Quantity, but can only be added to or -- subtracted from another adimensional Quantity. -- --
-- >>> 2*adim + 4*adim -- 6 <adimensional> -- -- >>> adim .+ meter -- -- <interactive>... error: -- • Unit mismatch: <adimensional> and m -- • In the expression: adim .+ meter -- In an equation for ‘it’: it = adim .+ meter --adim :: Num a => Quantity Adimensional a adim' :: Num a => a -> Quantity Adimensional a meter :: Num a => Quantity (SingleUnit 'Meter) a meter' :: Num a => a -> Quantity (SingleUnit 'Meter) a kilogram :: Num a => Quantity (SingleUnit 'Kilogram) a kilogram' :: Num a => a -> Quantity (SingleUnit 'Kilogram) a -- | A constructor for 1/1000th of a kilogram, to use with SI prefixes. gram :: Fractional a => Quantity (SingleUnit 'Kilogram) a -- | A constructor for 1/1000th of a kilogram, to use with SI prefixes. gram' :: Fractional a => a -> Quantity (SingleUnit 'Kilogram) a second :: Num a => Quantity (SingleUnit 'Second) a second' :: Num a => a -> Quantity (SingleUnit 'Second) a ampere :: Num a => Quantity (SingleUnit 'Ampere) a ampere' :: Num a => a -> Quantity (SingleUnit 'Ampere) a kelvin :: Num a => Quantity (SingleUnit 'Kelvin) a kelvin' :: Num a => a -> Quantity (SingleUnit 'Kelvin) a mole :: Num a => Quantity (SingleUnit 'Mole) a mole' :: Num a => a -> Quantity (SingleUnit 'Mole) a candela :: Num a => Quantity (SingleUnit 'Candela) a candela' :: Num a => a -> Quantity (SingleUnit 'Candela) a yocto :: Fractional a => Quantity us a -> Quantity us a yocto' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a zepto :: Fractional a => Quantity us a -> Quantity us a zepto' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a atto :: Fractional a => Quantity us a -> Quantity us a atto' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a femto :: Fractional a => Quantity us a -> Quantity us a femto' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a pico :: Fractional a => Quantity us a -> Quantity us a pico' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a nano :: Fractional a => Quantity us a -> Quantity us a nano' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a micro :: Fractional a => Quantity us a -> Quantity us a micro' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a milli :: Fractional a => Quantity us a -> Quantity us a milli' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a centi :: Fractional a => Quantity us a -> Quantity us a centi' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a deci :: Fractional a => Quantity us a -> Quantity us a deci' :: Fractional a => (a -> Quantity us a) -> a -> Quantity us a deka :: Num a => Quantity us a -> Quantity us a deka' :: Num a => (a -> Quantity us a) -> a -> Quantity us a hecto :: Num a => Quantity us a -> Quantity us a hecto' :: Num a => (a -> Quantity us a) -> a -> Quantity us a kilo :: Num a => Quantity us a -> Quantity us a kilo' :: Num a => (a -> Quantity us a) -> a -> Quantity us a mega :: Num a => Quantity us a -> Quantity us a mega' :: Num a => (a -> Quantity us a) -> a -> Quantity us a giga :: Num a => Quantity us a -> Quantity us a giga' :: Num a => (a -> Quantity us a) -> a -> Quantity us a tera :: Num a => Quantity us a -> Quantity us a tera' :: Num a => (a -> Quantity us a) -> a -> Quantity us a peta :: Num a => Quantity us a -> Quantity us a peta' :: Num a => (a -> Quantity us a) -> a -> Quantity us a exa :: Num a => Quantity us a -> Quantity us a exa' :: Num a => (a -> Quantity us a) -> a -> Quantity us a zetta :: Num a => Quantity us a -> Quantity us a zetta' :: Num a => (a -> Quantity us a) -> a -> Quantity us a yotta :: Num a => Quantity us a -> Quantity us a yotta' :: Num a => (a -> Quantity us a) -> a -> Quantity us a