{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Numeric.Units.Dimensional
(
Dimensional,
Unit, Quantity,
Metricality(..),
Dimension (Dim),
type (*), type (/), type (^), NRoot, Sqrt, Cbrt, Recip,
Dimension' (Dim'), HasDimension(..), KnownDimension,
(*~), (/~),
(^), (^/), (**), (*), (/), (+), (-),
negate, abs, signum, recip, nroot, sqrt, cbrt,
exp, log, logBase, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh, atan2, log1p, expm1, log1pexp, log1mexp,
(*~~), (/~~), sum, mean, product, dimensionlessLength, nFromTo,
DOne, DLength, DMass, DTime, DElectricCurrent, DThermodynamicTemperature, DAmountOfSubstance, DLuminousIntensity,
Dimensionless, Length, Mass, Time, ElectricCurrent, ThermodynamicTemperature, AmountOfSubstance, LuminousIntensity,
_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, pi, tau,
siUnit, one, mkUnitR, mkUnitQ, mkUnitZ,
name, exactValue, weaken, strengthen, exactify,
showIn,
KnownVariant(dmap), changeRep, changeRepApproximate,
asLens
)
where
import Prelude
( Eq(..), Num, Fractional, Floating, Real, RealFloat, Functor, fmap
, (.), flip, (++), fromIntegral, fromInteger, fromRational, error, max, succ
, Int, Integer, Integral, ($), uncurry, realToFrac, otherwise
)
import qualified Prelude
import Numeric.NumType.DK.Integers
( pos2, pos3
, KnownTypeInt, toNum
)
import Data.Data
import Data.ExactPi
import Data.Foldable (Foldable(foldr, length))
import Data.Maybe
import Data.Ratio
import qualified Numeric
import Numeric.Units.Dimensional.Dimensions
import Numeric.Units.Dimensional.Internal
import Numeric.Units.Dimensional.UnitNames hiding ((*), (/), (^), weaken, strengthen, product)
import qualified Numeric.Units.Dimensional.UnitNames.Internal as Name
import Numeric.Units.Dimensional.Variants hiding (type (*), type (/))
import qualified Numeric.Units.Dimensional.Variants as V
infixr 8 ^, ^/, **
infixl 7 *, /
infixl 6 +, -
name :: Unit m d a -> UnitName m
name :: Unit m d a -> UnitName m
name (Unit n _ _) = UnitName m
n
exactValue :: Unit m d a -> ExactPi
exactValue :: Unit m d a -> ExactPi
exactValue (Unit _ e _) = ExactPi
e
weaken :: Unit m d a -> Unit 'NonMetric d a
weaken :: Unit m d a -> Unit 'NonMetric d a
weaken (Unit n e v) = UnitName 'NonMetric -> ExactPi -> a -> Unit 'NonMetric d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit (UnitName m -> UnitName 'NonMetric
forall (m :: Metricality). UnitName m -> UnitName 'NonMetric
Name.weaken UnitName m
n) ExactPi
e a
v
strengthen :: Unit m d a -> Maybe (Unit 'Metric d a)
strengthen :: Unit m d a -> Maybe (Unit 'Metric d a)
strengthen (Unit n e v) | Just UnitName 'Metric
n' <- UnitName m -> Maybe (UnitName 'Metric)
forall (m :: Metricality). UnitName m -> Maybe (UnitName 'Metric)
Name.strengthen UnitName m
n = Unit 'Metric d a -> Maybe (Unit 'Metric d a)
forall a. a -> Maybe a
Just (Unit 'Metric d a -> Maybe (Unit 'Metric d a))
-> Unit 'Metric d a -> Maybe (Unit 'Metric d a)
forall a b. (a -> b) -> a -> b
$ UnitName 'Metric -> ExactPi -> a -> Unit 'Metric d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName 'Metric
n' ExactPi
e a
v
| Bool
otherwise = Maybe (Unit 'Metric d a)
forall a. Maybe a
Nothing
exactify :: Unit m d a -> Unit m d ExactPi
exactify :: Unit m d a -> Unit m d ExactPi
exactify (Unit n e _) = UnitName m -> ExactPi -> ExactPi -> Unit m d ExactPi
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName m
n ExactPi
e ExactPi
e
(*~) :: (Num a) => a -> Unit m d a -> Quantity d a
a
x *~ :: a -> Unit m d a -> Quantity d a
*~ (Unit _ _ y) = a -> Quantity d a
forall (s :: ExactPi') (d :: Dimension) a.
a -> Dimensional ('DQuantity s) d a
Quantity (a
x a -> a -> a
forall a. Num a => a -> a -> a
Prelude.* a
y)
(/~) :: Fractional a => Quantity d a -> Unit m d a -> a
(Quantity x) /~ :: Quantity d a -> Unit m d a -> a
/~ (Unit _ _ y) = (a
x a -> a -> a
forall a. Fractional a => a -> a -> a
Prelude./ a
y)
infixl 7 *~, /~
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
(*) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 V.* v2), Num a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 V.* v2) (d1 * d2) a
* :: Dimensional v1 d1 a
-> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a
(*) = (ExactPi -> ExactPi -> ExactPi)
-> (a -> a -> a)
-> UnitNameTransformer2
-> Dimensional v1 d1 a
-> Dimensional v2 d2 a
-> Dimensional (v1 * v2) (d1 * d2) a
forall (v1 :: Variant) (v2 :: Variant) (v3 :: Variant) a
(d1 :: Dimension) (d2 :: Dimension) (d3 :: Dimension).
(KnownVariant v1, KnownVariant v2, KnownVariant v3) =>
(ExactPi -> ExactPi -> ExactPi)
-> (a -> a -> a)
-> UnitNameTransformer2
-> Dimensional v1 d1 a
-> Dimensional v2 d2 a
-> Dimensional v3 d3 a
liftD2 ExactPi -> ExactPi -> ExactPi
forall a. Num a => a -> a -> a
(Prelude.*) a -> a -> a
forall a. Num a => a -> a -> a
(Prelude.*) UnitNameTransformer2
(Name.*)
(/) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 V./ v2), Fractional a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 V./ v2) (d1 / d2) a
/ :: Dimensional v1 d1 a
-> Dimensional v2 d2 a -> Dimensional (v1 / v2) (d1 / d2) a
(/) = (ExactPi -> ExactPi -> ExactPi)
-> (a -> a -> a)
-> UnitNameTransformer2
-> Dimensional v1 d1 a
-> Dimensional v2 d2 a
-> Dimensional (v1 / v2) (d1 / d2) a
forall (v1 :: Variant) (v2 :: Variant) (v3 :: Variant) a
(d1 :: Dimension) (d2 :: Dimension) (d3 :: Dimension).
(KnownVariant v1, KnownVariant v2, KnownVariant v3) =>
(ExactPi -> ExactPi -> ExactPi)
-> (a -> a -> a)
-> UnitNameTransformer2
-> Dimensional v1 d1 a
-> Dimensional v2 d2 a
-> Dimensional v3 d3 a
liftD2 ExactPi -> ExactPi -> ExactPi
forall a. Fractional a => a -> a -> a
(Prelude./) a -> a -> a
forall a. Fractional a => a -> a -> a
(Prelude./) UnitNameTransformer2
(Name./)
recip :: (Fractional a) => Quantity d a -> Quantity (Recip d) a
recip :: Quantity d a -> Quantity (Recip d) a
recip = (a -> a) -> Quantity d a -> Quantity (Recip d) a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension).
(a -> a) -> SQuantity s1 d1 a -> SQuantity s2 d2 a
liftQ a -> a
forall a. Fractional a => a -> a
Prelude.recip
(^) :: (Fractional a, KnownTypeInt i, KnownVariant v, KnownVariant (Weaken v))
=> Dimensional v d1 a -> Proxy i -> Dimensional (Weaken v) (d1 ^ i) a
Dimensional v d1 a
x ^ :: Dimensional v d1 a -> Proxy i -> Dimensional (Weaken v) (d1 ^ i) a
^ Proxy i
n = let n' :: Int
n' = (Proxy i -> Int
forall (i :: TypeInt) a. (KnownTypeInt i, Num a) => Proxy i -> a
toNum Proxy i
n) :: Int
in (ExactPi -> ExactPi)
-> (a -> a)
-> (forall (m :: Metricality). UnitName m -> UnitName 'NonMetric)
-> Dimensional v d1 a
-> Dimensional (Weaken v) (d1 ^ i) a
forall (v1 :: Variant) (v2 :: Variant) a b (d1 :: Dimension)
(d2 :: Dimension).
(KnownVariant v1, KnownVariant v2) =>
(ExactPi -> ExactPi)
-> (a -> b)
-> (forall (m :: Metricality). UnitName m -> UnitName 'NonMetric)
-> Dimensional v1 d1 a
-> Dimensional v2 d2 b
liftD (ExactPi -> Int -> ExactPi
forall a b. (Fractional a, Integral b) => a -> b -> a
Prelude.^^ Int
n') (a -> Int -> a
forall a b. (Fractional a, Integral b) => a -> b -> a
Prelude.^^ Int
n') (UnitName m -> Int -> UnitName 'NonMetric
forall (m :: Metricality). UnitName m -> Int -> UnitName 'NonMetric
Name.^ Int
n') Dimensional v d1 a
x
negate :: Num a => Quantity d a -> Quantity d a
negate :: Quantity d a -> Quantity d a
negate = (a -> a) -> Quantity d a -> Quantity d a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension).
(a -> a) -> SQuantity s1 d1 a -> SQuantity s2 d2 a
liftQ a -> a
forall a. Num a => a -> a
Prelude.negate
(+) :: Num a => Quantity d a -> Quantity d a -> Quantity d a
+ :: Quantity d a -> Quantity d a -> Quantity d a
(+) = (a -> a -> a) -> Quantity d a -> Quantity d a -> Quantity d a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension) (s3 :: ExactPi') (d3 :: Dimension).
(a -> a -> a)
-> SQuantity s1 d1 a -> SQuantity s2 d2 a -> SQuantity s3 d3 a
liftQ2 a -> a -> a
forall a. Num a => a -> a -> a
(Prelude.+)
(-) :: Num a => Quantity d a -> Quantity d a -> Quantity d a
(-) = (a -> a -> a) -> Quantity d a -> Quantity d a -> Quantity d a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension) (s3 :: ExactPi') (d3 :: Dimension).
(a -> a -> a)
-> SQuantity s1 d1 a -> SQuantity s2 d2 a -> SQuantity s3 d3 a
liftQ2 a -> a -> a
forall a. Num a => a -> a -> a
(Prelude.-)
abs :: Num a => Quantity d a -> Quantity d a
abs :: Quantity d a -> Quantity d a
abs = (a -> a) -> Quantity d a -> Quantity d a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension).
(a -> a) -> SQuantity s1 d1 a -> SQuantity s2 d2 a
liftQ a -> a
forall a. Num a => a -> a
Prelude.abs
signum :: Num a => Quantity d a -> Dimensionless a
signum :: Quantity d a -> Dimensionless a
signum = (a -> a) -> Quantity d a -> Dimensionless a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension).
(a -> a) -> SQuantity s1 d1 a -> SQuantity s2 d2 a
liftQ a -> a
forall a. Num a => a -> a
Prelude.signum
nroot :: (KnownTypeInt n, Floating a)
=> Proxy n -> Quantity d a -> Quantity (NRoot d n) a
nroot :: Proxy n -> Quantity d a -> Quantity (NRoot d n) a
nroot Proxy n
n = let n' :: a
n' = a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
Prelude./ Proxy n -> a
forall (i :: TypeInt) a. (KnownTypeInt i, Num a) => Proxy i -> a
toNum Proxy n
n
in (a -> a) -> Quantity d a -> Quantity (NRoot d n) a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension).
(a -> a) -> SQuantity s1 d1 a -> SQuantity s2 d2 a
liftQ (a -> a -> a
forall a. Floating a => a -> a -> a
Prelude.** a
n')
sqrt :: Floating a => Quantity d a -> Quantity (Sqrt d) a
sqrt :: Quantity d a -> Quantity (Sqrt d) a
sqrt = Proxy 'Pos2 -> Quantity d a -> Quantity (Sqrt d) a
forall (n :: TypeInt) a (d :: Dimension).
(KnownTypeInt n, Floating a) =>
Proxy n -> Quantity d a -> Quantity (NRoot d n) a
nroot Proxy 'Pos2
pos2
cbrt :: Floating a => Quantity d a -> Quantity (Cbrt d) a
cbrt :: Quantity d a -> Quantity (Cbrt d) a
cbrt = Proxy 'Pos3 -> Quantity d a -> Quantity (Cbrt d) a
forall (n :: TypeInt) a (d :: Dimension).
(KnownTypeInt n, Floating a) =>
Proxy n -> Quantity d a -> Quantity (NRoot d n) a
nroot Proxy 'Pos3
pos3
(^/) :: (KnownTypeInt n, Floating a)
=> Quantity d a -> Proxy n -> Quantity (NRoot d n) a
^/ :: Quantity d a -> Proxy n -> Quantity (NRoot d n) a
(^/) = (Proxy n -> Quantity d a -> Quantity (NRoot d n) a)
-> Quantity d a -> Proxy n -> Quantity (NRoot d n) a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Proxy n -> Quantity d a -> Quantity (NRoot d n) a
forall (n :: TypeInt) a (d :: Dimension).
(KnownTypeInt n, Floating a) =>
Proxy n -> Quantity d a -> Quantity (NRoot d n) a
nroot
(*~~) :: (Functor f, Num a) => f a -> Unit m d a -> f (Quantity d a)
f a
xs *~~ :: f a -> Unit m d a -> f (Quantity d a)
*~~ Unit m d a
u = (a -> Quantity d a) -> f a -> f (Quantity d a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> Unit m d a -> Quantity d a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit m d a
u) f a
xs
(/~~) :: forall f m d a.(Functor f, Fractional a) => f (Quantity d a) -> Unit m d a -> f a
f (Quantity d a)
xs /~~ :: f (Quantity d a) -> Unit m d a -> f a
/~~ Unit m d a
u = (Quantity d a -> a) -> f (Quantity d a) -> f a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (Quantity d a -> Unit m d a -> a
forall a (d :: Dimension) (m :: Metricality).
Fractional a =>
Quantity d a -> Unit m d a -> a
/~ Unit m d a
u) f (Quantity d a)
xs
infixl 7 *~~, /~~
sum :: (Num a, Foldable f) => f (Quantity d a) -> Quantity d a
sum :: f (Quantity d a) -> Quantity d a
sum = (Quantity d a -> Quantity d a -> Quantity d a)
-> Quantity d a -> f (Quantity d a) -> Quantity d a
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Quantity d a -> Quantity d a -> Quantity d a
forall a (d :: Dimension).
Num a =>
Quantity d a -> Quantity d a -> Quantity d a
(+) Quantity d a
forall a (d :: Dimension). Num a => Quantity d a
_0
product :: (Num a, Foldable f) => f (Dimensionless a) -> Dimensionless a
product :: f (Dimensionless a) -> Dimensionless a
product = (Dimensionless a -> Dimensionless a -> Dimensionless a)
-> Dimensionless a -> f (Dimensionless a) -> Dimensionless a
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Dimensionless a -> Dimensionless a -> Dimensionless a
forall (v1 :: Variant) (v2 :: Variant) a (d1 :: Dimension)
(d2 :: Dimension).
(KnownVariant v1, KnownVariant v2, KnownVariant (v1 * v2),
Num a) =>
Dimensional v1 d1 a
-> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a
(*) Dimensionless a
forall a. Num a => Dimensionless a
_1
mean :: (Fractional a, Foldable f) => f (Quantity d a) -> Quantity d a
mean :: f (Quantity d a) -> Quantity d a
mean = (Quantity d a
-> Dimensional ('DQuantity One) DOne a -> Quantity d a)
-> (Quantity d a, Dimensional ('DQuantity One) DOne a)
-> Quantity d a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Quantity d a -> Dimensional ('DQuantity One) DOne a -> Quantity d a
forall (v1 :: Variant) (v2 :: Variant) a (d1 :: Dimension)
(d2 :: Dimension).
(KnownVariant v1, KnownVariant v2, KnownVariant (v1 / v2),
Fractional a) =>
Dimensional v1 d1 a
-> Dimensional v2 d2 a -> Dimensional (v1 / v2) (d1 / d2) a
(/) ((Quantity d a, Dimensional ('DQuantity One) DOne a)
-> Quantity d a)
-> (f (Quantity d a)
-> (Quantity d a, Dimensional ('DQuantity One) DOne a))
-> f (Quantity d a)
-> Quantity d a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Quantity d a
-> (Quantity d a, Dimensional ('DQuantity One) DOne a)
-> (Quantity d a, Dimensional ('DQuantity One) DOne a))
-> (Quantity d a, Dimensional ('DQuantity One) DOne a)
-> f (Quantity d a)
-> (Quantity d a, Dimensional ('DQuantity One) DOne a)
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Quantity d a
-> (Quantity d a, Dimensional ('DQuantity One) DOne a)
-> (Quantity d a, Dimensional ('DQuantity One) DOne a)
forall a a (d :: Dimension).
(Num a, Num a) =>
Quantity d a
-> (Quantity d a, Quantity DOne a)
-> (Quantity d a, Quantity DOne a)
accumulate (Quantity d a
forall a (d :: Dimension). Num a => Quantity d a
_0, Dimensional ('DQuantity One) DOne a
forall a (d :: Dimension). Num a => Quantity d a
_0)
where
accumulate :: Quantity d a
-> (Quantity d a, Quantity DOne a)
-> (Quantity d a, Quantity DOne a)
accumulate Quantity d a
val (Quantity d a
accum, Quantity DOne a
count) = (Quantity d a
accum Quantity d a -> Quantity d a -> Quantity d a
forall a (d :: Dimension).
Num a =>
Quantity d a -> Quantity d a -> Quantity d a
+ Quantity d a
val, Quantity DOne a
count Quantity DOne a -> Quantity DOne a -> Quantity DOne a
forall a (d :: Dimension).
Num a =>
Quantity d a -> Quantity d a -> Quantity d a
+ Quantity DOne a
forall a. Num a => Dimensionless a
_1)
dimensionlessLength :: (Num a, Foldable f) => f b -> Dimensionless a
dimensionlessLength :: f b -> Dimensionless a
dimensionlessLength f b
x = (Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> a) -> Int -> a
forall a b. (a -> b) -> a -> b
$ f b -> Int
forall (t :: Type -> Type) a. Foldable t => t a -> Int
length f b
x) a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
nFromTo :: (Fractional a, Integral b) => Quantity d a
-> Quantity d a
-> b
-> [Quantity d a]
nFromTo :: Quantity d a -> Quantity d a -> b -> [Quantity d a]
nFromTo Quantity d a
xi Quantity d a
xf b
n = (b -> Quantity d a) -> [b] -> [Quantity d a]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> Quantity d a
f [b
0..b
n'] [Quantity d a] -> [Quantity d a] -> [Quantity d a]
forall a. [a] -> [a] -> [a]
++ [Quantity d a
xf]
where
n' :: b
n' = b -> b -> b
forall a. Ord a => a -> a -> a
max b
0 b
n
f :: b -> Quantity d a
f b
i = Quantity d a
xi Quantity d a -> Quantity d a -> Quantity d a
forall a (d :: Dimension).
Num a =>
Quantity d a -> Quantity d a -> Quantity d a
+ Ratio b -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac (b
i b -> b -> Ratio b
forall a. Integral a => a -> a -> Ratio a
% b -> b
forall a. Enum a => a -> a
succ b
n') a -> Unit 'NonMetric DOne a -> Quantity DOne a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one Quantity DOne a
-> Quantity d a
-> Dimensional ('DQuantity One * 'DQuantity One) (DOne * d) a
forall (v1 :: Variant) (v2 :: Variant) a (d1 :: Dimension)
(d2 :: Dimension).
(KnownVariant v1, KnownVariant v2, KnownVariant (v1 * v2),
Num a) =>
Dimensional v1 d1 a
-> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a
* (Quantity d a
xf Quantity d a -> Quantity d a -> Quantity d a
forall a (d :: Dimension).
Num a =>
Quantity d a -> Quantity d a -> Quantity d a
- Quantity d a
xi)
exp, log, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh, log1p, expm1, log1pexp, log1mexp
:: Floating a => Dimensionless a -> Dimensionless a
exp :: Dimensionless a -> Dimensionless a
exp = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.exp
log :: Dimensionless a -> Dimensionless a
log = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.log
sin :: Dimensionless a -> Dimensionless a
sin = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.sin
cos :: Dimensionless a -> Dimensionless a
cos = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.cos
tan :: Dimensionless a -> Dimensionless a
tan = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.tan
asin :: Dimensionless a -> Dimensionless a
asin = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.asin
acos :: Dimensionless a -> Dimensionless a
acos = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.acos
atan :: Dimensionless a -> Dimensionless a
atan = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.atan
sinh :: Dimensionless a -> Dimensionless a
sinh = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.sinh
cosh :: Dimensionless a -> Dimensionless a
cosh = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.cosh
tanh :: Dimensionless a -> Dimensionless a
tanh = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.tanh
asinh :: Dimensionless a -> Dimensionless a
asinh = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.asinh
acosh :: Dimensionless a -> Dimensionless a
acosh = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.acosh
atanh :: Dimensionless a -> Dimensionless a
atanh = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Prelude.atanh
log1p :: Dimensionless a -> Dimensionless a
log1p = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Numeric.log1p
expm1 :: Dimensionless a -> Dimensionless a
expm1 = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Numeric.expm1
log1pexp :: Dimensionless a -> Dimensionless a
log1pexp = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Numeric.log1pexp
log1mexp :: Dimensionless a -> Dimensionless a
log1mexp = (a -> a) -> Dimensionless a -> Dimensionless a
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
Numeric.log1mexp
(**) :: Floating a => Dimensionless a -> Dimensionless a -> Dimensionless a
** :: Dimensionless a -> Dimensionless a -> Dimensionless a
(**) = (a -> a -> a)
-> Dimensionless a -> Dimensionless a -> Dimensionless a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension) (s3 :: ExactPi') (d3 :: Dimension).
(a -> a -> a)
-> SQuantity s1 d1 a -> SQuantity s2 d2 a -> SQuantity s3 d3 a
liftQ2 a -> a -> a
forall a. Floating a => a -> a -> a
(Prelude.**)
logBase :: Floating a => Dimensionless a -> Dimensionless a -> Dimensionless a
logBase :: Dimensionless a -> Dimensionless a -> Dimensionless a
logBase = (a -> a -> a)
-> Dimensionless a -> Dimensionless a -> Dimensionless a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension) (s3 :: ExactPi') (d3 :: Dimension).
(a -> a -> a)
-> SQuantity s1 d1 a -> SQuantity s2 d2 a -> SQuantity s3 d3 a
liftQ2 a -> a -> a
forall a. Floating a => a -> a -> a
Prelude.logBase
atan2 :: (RealFloat a) => Quantity d a -> Quantity d a -> Dimensionless a
atan2 :: Quantity d a -> Quantity d a -> Dimensionless a
atan2 = (a -> a -> a) -> Quantity d a -> Quantity d a -> Dimensionless a
forall a (s1 :: ExactPi') (d1 :: Dimension) (s2 :: ExactPi')
(d2 :: Dimension) (s3 :: ExactPi') (d3 :: Dimension).
(a -> a -> a)
-> SQuantity s1 d1 a -> SQuantity s2 d2 a -> SQuantity s3 d3 a
liftQ2 a -> a -> a
forall a. RealFloat a => a -> a -> a
Prelude.atan2
one :: Num a => Unit 'NonMetric DOne a
one :: Unit 'NonMetric DOne a
one = UnitName 'NonMetric -> ExactPi -> a -> Unit 'NonMetric DOne a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName 'NonMetric
nOne ExactPi
1 a
1
_0 :: Num a => Quantity d a
_0 :: Quantity d a
_0 = a -> Quantity d a
forall (s :: ExactPi') (d :: Dimension) a.
a -> Dimensional ('DQuantity s) d a
Quantity a
0
_1, _2, _3, _4, _5, _6, _7, _8, _9 :: (Num a) => Dimensionless a
_1 :: Dimensionless a
_1 = a
1 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_2 :: Dimensionless a
_2 = a
2 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_3 :: Dimensionless a
_3 = a
3 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_4 :: Dimensionless a
_4 = a
4 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_5 :: Dimensionless a
_5 = a
5 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_6 :: Dimensionless a
_6 = a
6 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_7 :: Dimensionless a
_7 = a
7 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_8 :: Dimensionless a
_8 = a
8 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
_9 :: Dimensionless a
_9 = a
9 a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
pi :: Floating a => Dimensionless a
pi :: Dimensionless a
pi = a
forall a. Floating a => a
Prelude.pi a -> Unit 'NonMetric DOne a -> Dimensionless a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit 'NonMetric DOne a
forall a. Num a => Unit 'NonMetric DOne a
one
tau :: Floating a => Dimensionless a
tau :: Dimensionless a
tau = Dimensionless a
forall a. Num a => Dimensionless a
_2 Dimensionless a
-> Dimensionless a
-> Dimensional ('DQuantity One * 'DQuantity One) (DOne * DOne) a
forall (v1 :: Variant) (v2 :: Variant) a (d1 :: Dimension)
(d2 :: Dimension).
(KnownVariant v1, KnownVariant v2, KnownVariant (v1 * v2),
Num a) =>
Dimensional v1 d1 a
-> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a
* Dimensionless a
forall a. Floating a => Dimensionless a
pi
changeRep :: (KnownVariant v, Real a, Fractional b) => Dimensional v d a -> Dimensional v d b
changeRep :: Dimensional v d a -> Dimensional v d b
changeRep = (a -> b) -> Dimensional v d a -> Dimensional v d b
forall (v :: Variant) a1 a2 (d :: Dimension).
KnownVariant v =>
(a1 -> a2) -> Dimensional v d a1 -> Dimensional v d a2
dmap a -> b
forall a b. (Real a, Fractional b) => a -> b
realToFrac
changeRepApproximate :: (KnownVariant v, Floating b) => Dimensional v d ExactPi -> Dimensional v d b
changeRepApproximate :: Dimensional v d ExactPi -> Dimensional v d b
changeRepApproximate = (ExactPi -> b) -> Dimensional v d ExactPi -> Dimensional v d b
forall (v :: Variant) a1 a2 (d :: Dimension).
KnownVariant v =>
(a1 -> a2) -> Dimensional v d a1 -> Dimensional v d a2
dmap ExactPi -> b
forall a. Floating a => ExactPi -> a
approximateValue
asLens :: (Fractional a) => Unit m d a
-> (forall f.Functor f => (a -> f a)
-> Quantity d a
-> f (Quantity d a))
asLens :: Unit m d a
-> forall (f :: Type -> Type).
Functor f =>
(a -> f a) -> Quantity d a -> f (Quantity d a)
asLens Unit m d a
u a -> f a
f Quantity d a
q = (a -> Quantity d a) -> f a -> f (Quantity d a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
v' -> a
v' a -> Unit m d a -> Quantity d a
forall a (m :: Metricality) (d :: Dimension).
Num a =>
a -> Unit m d a -> Quantity d a
*~ Unit m d a
u) (a -> f a
f (Quantity d a
q Quantity d a -> Unit m d a -> a
forall a (d :: Dimension) (m :: Metricality).
Fractional a =>
Quantity d a -> Unit m d a -> a
/~ Unit m d a
u))
mkUnitR :: Floating a => UnitName m -> ExactPi -> Unit m1 d a -> Unit m d a
mkUnitR :: UnitName m -> ExactPi -> Unit m1 d a -> Unit m d a
mkUnitR UnitName m
n ExactPi
s (Unit _ e _) | ExactPi -> Bool
isExactZero ExactPi
s = [Char] -> Unit m d a
forall a. HasCallStack => [Char] -> a
error [Char]
"Supplying zero as a conversion factor is not valid."
| Bool
otherwise = UnitName m -> ExactPi -> a -> Unit m d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName m
n ExactPi
e' a
x'
where
e' :: ExactPi
e' = ExactPi
s ExactPi -> ExactPi -> ExactPi
forall a. Num a => a -> a -> a
Prelude.* ExactPi
e
x' :: a
x' = ExactPi -> a
forall a. Floating a => ExactPi -> a
approximateValue ExactPi
e'
mkUnitQ :: Fractional a => UnitName m -> Rational -> Unit m1 d a -> Unit m d a
mkUnitQ :: UnitName m -> Rational -> Unit m1 d a -> Unit m d a
mkUnitQ UnitName m
n Rational
s (Unit _ e x) | Rational
s Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
0 = [Char] -> Unit m d a
forall a. HasCallStack => [Char] -> a
error [Char]
"Supplying zero as a conversion factor is not valid."
| Just Rational
x'' <- ExactPi -> Maybe Rational
toExactRational ExactPi
e' = UnitName m -> ExactPi -> a -> Unit m d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName m
n ExactPi
e' (Rational -> a
forall a. Fractional a => Rational -> a
fromRational Rational
x'')
| Bool
otherwise = UnitName m -> ExactPi -> a -> Unit m d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName m
n ExactPi
e' a
x'
where
e' :: ExactPi
e' = Rational -> ExactPi
forall a. Fractional a => Rational -> a
fromRational Rational
s ExactPi -> ExactPi -> ExactPi
forall a. Num a => a -> a -> a
Prelude.* ExactPi
e
x' :: a
x' = Rational -> a
forall a. Fractional a => Rational -> a
fromRational Rational
s a -> a -> a
forall a. Num a => a -> a -> a
Prelude.* a
x
mkUnitZ :: Num a => UnitName m -> Integer -> Unit m1 d a -> Unit m d a
mkUnitZ :: UnitName m -> Integer -> Unit m1 d a -> Unit m d a
mkUnitZ UnitName m
n Integer
s (Unit _ e x) | Integer
s Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0 = [Char] -> Unit m d a
forall a. HasCallStack => [Char] -> a
error [Char]
"Supplying zero as a conversion factor is not valid."
| Just Integer
x'' <- ExactPi -> Maybe Integer
toExactInteger ExactPi
e' = UnitName m -> ExactPi -> a -> Unit m d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName m
n ExactPi
e' (Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
x'')
| Bool
otherwise = UnitName m -> ExactPi -> a -> Unit m d a
forall (m :: Metricality) (d :: Dimension) a.
UnitName m -> ExactPi -> a -> Dimensional ('DUnit m) d a
Unit UnitName m
n ExactPi
e' a
x'
where
e' :: ExactPi
e' = Integer -> ExactPi
forall a. Num a => Integer -> a
fromInteger Integer
s ExactPi -> ExactPi -> ExactPi
forall a. Num a => a -> a -> a
Prelude.* ExactPi
e
x' :: a
x' = Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
s a -> a -> a
forall a. Num a => a -> a -> a
Prelude.* a
x