-- 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