-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Statically checked physical dimensions -- -- 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 wrapping and unwrapping 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 8.0 or later. @package dimensional @version 1.6 -- | 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.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 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 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 GHC.Base.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: -- --
-- v :: Velocity Double -- v = 90 *~ (kilo meter / hour) ---- -- It follows naturally that the numerical value of a quantity is -- obtained by division by a unit. -- --
-- numval :: 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.
--
-- -- 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 log1p :: Floating a => Dimensionless a -> Dimensionless a expm1 :: Floating a => Dimensionless a -> Dimensionless a log1pexp :: Floating a => Dimensionless a -> Dimensionless a log1mexp :: Floating a => Dimensionless 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 -- https://tauday.com/tau-manifesto (but also feel free to review -- https://web.archive.org/web/20200926221249/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 "wrapping" 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. -- -- Uses non-breaking spaces between the value and the unit, and within -- the unit name. -- --
-- >>> putStrLn $ 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) -- | 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) -- |
-- >>> 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 -- |
-- 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 -- | 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 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 -- | 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 -- NonMetric. (/) :: (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 / -- | 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 -- | 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 pi :: Floating a => Dimensionless a exp :: Floating a => Dimensionless a -> Dimensionless a log :: Floating a => Dimensionless a -> Dimensionless 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 -- | Raises a dimensionless quantity to a dimensionless power. (**) :: Floating a => Dimensionless a -> Dimensionless a -> Dimensionless a infixr 8 ** -- | 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 log1p :: Floating a => Dimensionless a -> Dimensionless a expm1 :: Floating a => Dimensionless a -> Dimensionless a log1pexp :: Floating a => Dimensionless a -> Dimensionless a log1mexp :: Floating a => Dimensionless a -> Dimensionless a -- | 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 /~ -- | 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 ^/ -- | 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 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 -- | 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 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 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 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 -- | Twice pi. -- -- For background on tau see -- https://tauday.com/tau-manifesto (but also feel free to review -- https://web.archive.org/web/20200926221249/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 "wrapping" 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. -- -- Uses non-breaking spaces between the value and the unit, and within -- the unit name. -- --
-- >>> putStrLn $ showIn watt $ (37 *~ volt) * (4 *~ ampere) -- 148.0 W --showIn :: (Show a, Fractional a) => Unit m d a -> Quantity d a -> String -- | 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) neg5 :: Proxy 'Neg5 neg4 :: Proxy 'Neg4 neg3 :: Proxy 'Neg3 neg2 :: Proxy 'Neg2 neg1 :: Proxy 'Neg1 zero :: Proxy 'Zero pos1 :: Proxy 'Pos1 pos2 :: Proxy 'Pos2 pos3 :: Proxy 'Pos3 pos4 :: Proxy 'Pos4 pos5 :: Proxy 'Pos5 -- | A class for categories. Instances should satisfy the laws -- --
-- >>> maximum [1..10] -- 10 ---- --
-- >>> maximum [] -- *** Exception: Prelude.maximum: empty list ---- --
-- >>> maximum Nothing -- *** Exception: maximum: empty structure ---- -- WARNING: This function is partial for possibly-empty structures like -- lists. maximum :: (Foldable t, Ord a) => t a -> a -- | The least element of a non-empty structure. -- -- This function is non-total and will raise a runtime exception if the -- structure happens to be empty. A structure that supports random access -- and maintains its elements in order should provide a specialised -- implementation to return the minimum in faster than linear time. -- --
-- >>> minimum [1..10] -- 1 ---- --
-- >>> minimum [] -- *** Exception: Prelude.minimum: empty list ---- --
-- >>> minimum Nothing -- *** Exception: minimum: empty structure ---- -- WARNING: This function is partial for possibly-empty structures like -- lists. minimum :: (Foldable t, Ord a) => t a -> a -- | A fixed-precision integer type with at least the range [-2^29 .. -- 2^29-1]. The exact range for a given implementation can be -- determined by using minBound and maxBound from the -- Bounded class. data () => Int -- | Single-precision floating point numbers. It is desirable that this -- type be at least equal in range and precision to the IEEE -- single-precision type. data () => Float -- | The character type Char is an enumeration whose values -- represent Unicode (or equivalently ISO/IEC 10646) code points (i.e. -- characters, see http://www.unicode.org/ for details). This set -- extends the ISO 8859-1 (Latin-1) character set (the first 256 -- characters), which is itself an extension of the ASCII character set -- (the first 128 characters). A character literal in Haskell has type -- Char. -- -- To convert a Char to or from the corresponding Int value -- defined by Unicode, use toEnum and fromEnum from the -- Enum class respectively (or equivalently ord and -- chr). data () => Char -- | A value of type IO a is a computation which, when -- performed, does some I/O before returning a value of type a. -- -- There is really only one way to "perform" an I/O action: bind it to -- Main.main in your program. When your program is run, the I/O -- will be performed. It isn't possible to perform I/O from an arbitrary -- function, unless that function is itself in the IO monad and -- called at some point, directly or indirectly, from Main.main. -- -- IO is a monad, so IO actions can be combined using -- either the do-notation or the >> and >>= -- operations from the Monad class. data () => IO a data () => Bool False :: Bool True :: Bool -- | Double-precision floating point numbers. It is desirable that this -- type be at least equal in range and precision to the IEEE -- double-precision type. data () => Double -- | A Word is an unsigned integral type, with the same size as -- Int. data () => Word data () => Ordering LT :: Ordering EQ :: Ordering GT :: Ordering -- | The Maybe type encapsulates an optional value. A value of type -- Maybe a either contains a value of type a -- (represented as Just a), or it is empty (represented -- as Nothing). Using Maybe is a good way to deal with -- errors or exceptional cases without resorting to drastic measures such -- as error. -- -- The Maybe type is also a monad. It is a simple kind of error -- monad, where all errors are represented by Nothing. A richer -- error monad can be built using the Either type. data () => Maybe a Nothing :: Maybe a Just :: a -> Maybe a -- | Lifted, homogeneous equality. By lifted, we mean that it can be bogus -- (deferred type error). By homogeneous, the two types a and -- b must have the same kinds. class a ~# b => (a :: k) ~ (b :: k) infix 4 ~ -- | Arbitrary precision integers. In contrast with fixed-size integral -- types such as Int, the Integer type represents the -- entire infinite range of integers. -- -- Integers are stored in a kind of sign-magnitude form, hence do not -- expect two's complement form when using bit operations. -- -- If the value is small (fit into an Int), IS constructor -- is used. Otherwise Integer and IN constructors are used -- to store a BigNat representing respectively the positive or the -- negative value magnitude. -- -- Invariant: Integer and IN are used iff value doesn't fit -- in IS data () => Integer -- | The Either type represents values with two possibilities: a -- value of type Either a b is either Left -- a or Right b. -- -- The Either type is sometimes used to represent a value which is -- either correct or an error; by convention, the Left constructor -- is used to hold an error value and the Right constructor is -- used to hold a correct value (mnemonic: "right" also means "correct"). -- --
-- >>> let s = Left "foo" :: Either String Int -- -- >>> s -- Left "foo" -- -- >>> let n = Right 3 :: Either String Int -- -- >>> n -- Right 3 -- -- >>> :type s -- s :: Either String Int -- -- >>> :type n -- n :: Either String Int ---- -- The fmap from our Functor instance will ignore -- Left values, but will apply the supplied function to values -- contained in a Right: -- --
-- >>> let s = Left "foo" :: Either String Int -- -- >>> let n = Right 3 :: Either String Int -- -- >>> fmap (*2) s -- Left "foo" -- -- >>> fmap (*2) n -- Right 6 ---- -- The Monad instance for Either allows us to chain -- together multiple actions which may fail, and fail overall if any of -- the individual steps failed. First we'll write a function that can -- either parse an Int from a Char, or fail. -- --
-- >>> import Data.Char ( digitToInt, isDigit )
--
-- >>> :{
-- let parseEither :: Char -> Either String Int
-- parseEither c
-- | isDigit c = Right (digitToInt c)
-- | otherwise = Left "parse error"
--
-- >>> :}
--
--
-- The following should work, since both '1' and '2'
-- can be parsed as Ints.
--
--
-- >>> :{
-- let parseMultiple :: Either String Int
-- parseMultiple = do
-- x <- parseEither '1'
-- y <- parseEither '2'
-- return (x + y)
--
-- >>> :}
--
--
-- -- >>> parseMultiple -- Right 3 ---- -- But the following should fail overall, since the first operation where -- we attempt to parse 'm' as an Int will fail: -- --
-- >>> :{
-- let parseMultiple :: Either String Int
-- parseMultiple = do
-- x <- parseEither 'm'
-- y <- parseEither '2'
-- return (x + y)
--
-- >>> :}
--
--
-- -- >>> parseMultiple -- Left "parse error" --data () => Either a b Left :: a -> Either a b Right :: b -> Either a b -- | Integral numbers, supporting integer division. -- -- The Haskell Report defines no laws for Integral. However, -- Integral instances are customarily expected to define a -- Euclidean domain and have the following properties for the -- div/mod and quot/rem pairs, given suitable -- Euclidean functions f and g: -- --
-- (x `quot` y)*y + (x `rem` y) == x ---- -- WARNING: This function is partial (because it throws when 0 is passed -- as the divisor) for all the integer types in base. rem :: Integral a => a -> a -> a -- | integer division truncated toward negative infinity -- -- WARNING: This function is partial (because it throws when 0 is passed -- as the divisor) for all the integer types in base. div :: Integral a => a -> a -> a -- | integer modulus, satisfying -- --
-- (x `div` y)*y + (x `mod` y) == x ---- -- WARNING: This function is partial (because it throws when 0 is passed -- as the divisor) for all the integer types in base. mod :: Integral a => a -> a -> a -- | simultaneous quot and rem -- -- WARNING: This function is partial (because it throws when 0 is passed -- as the divisor) for all the integer types in base. quotRem :: Integral a => a -> a -> (a, a) -- | simultaneous div and mod -- -- WARNING: This function is partial (because it throws when 0 is passed -- as the divisor) for all the integer types in base. divMod :: Integral a => a -> a -> (a, a) -- | conversion to Integer toInteger :: Integral a => a -> Integer infixl 7 `quot` infixl 7 `rem` infixl 7 `div` infixl 7 `mod` -- | Arbitrary-precision rational numbers, represented as a ratio of two -- Integer values. A rational number may be constructed using the -- % operator. type Rational = Ratio Integer -- | A String is a list of characters. String constants in Haskell -- are values of type String. -- -- See Data.List for operations on lists. type String = [Char] -- | Parsing of Strings, producing values. -- -- Derived instances of Read make the following assumptions, which -- derived instances of Show obey: -- --
-- infixr 5 :^: -- data Tree a = Leaf a | Tree a :^: Tree a ---- -- the derived instance of Read in Haskell 2010 is equivalent to -- --
-- instance (Read a) => Read (Tree a) where
--
-- readsPrec d r = readParen (d > app_prec)
-- (\r -> [(Leaf m,t) |
-- ("Leaf",s) <- lex r,
-- (m,t) <- readsPrec (app_prec+1) s]) r
--
-- ++ readParen (d > up_prec)
-- (\r -> [(u:^:v,w) |
-- (u,s) <- readsPrec (up_prec+1) r,
-- (":^:",t) <- lex s,
-- (v,w) <- readsPrec (up_prec+1) t]) r
--
-- where app_prec = 10
-- up_prec = 5
--
--
-- Note that right-associativity of :^: is unused.
--
-- The derived instance in GHC is equivalent to
--
-- -- instance (Read a) => Read (Tree a) where -- -- readPrec = parens $ (prec app_prec $ do -- Ident "Leaf" <- lexP -- m <- step readPrec -- return (Leaf m)) -- -- +++ (prec up_prec $ do -- u <- step readPrec -- Symbol ":^:" <- lexP -- v <- step readPrec -- return (u :^: v)) -- -- where app_prec = 10 -- up_prec = 5 -- -- readListPrec = readListPrecDefault ---- -- Why do both readsPrec and readPrec exist, and why does -- GHC opt to implement readPrec in derived Read instances -- instead of readsPrec? The reason is that readsPrec is -- based on the ReadS type, and although ReadS is mentioned -- in the Haskell 2010 Report, it is not a very efficient parser data -- structure. -- -- readPrec, on the other hand, is based on a much more efficient -- ReadPrec datatype (a.k.a "new-style parsers"), but its -- definition relies on the use of the RankNTypes language -- extension. Therefore, readPrec (and its cousin, -- readListPrec) are marked as GHC-only. Nevertheless, it is -- recommended to use readPrec instead of readsPrec -- whenever possible for the efficiency improvements it brings. -- -- As mentioned above, derived Read instances in GHC will -- implement readPrec instead of readsPrec. The default -- implementations of readsPrec (and its cousin, readList) -- will simply use readPrec under the hood. If you are writing a -- Read instance by hand, it is recommended to write it like so: -- --
-- instance Read T where -- readPrec = ... -- readListPrec = readListPrecDefault --class () => Read a -- | attempts to parse a value from the front of the string, returning a -- list of (parsed value, remaining string) pairs. If there is no -- successful parse, the returned list is empty. -- -- Derived instances of Read and Show satisfy the -- following: -- -- -- -- That is, readsPrec parses the string produced by -- showsPrec, and delivers the value that showsPrec started -- with. readsPrec :: Read a => Int -> ReadS a -- | The method readList is provided to allow the programmer to give -- a specialised way of parsing lists of values. For example, this is -- used by the predefined Read instance of the Char type, -- where values of type String should be are expected to use -- double quotes, rather than square brackets. readList :: Read a => ReadS [a] -- | Conversion of values to readable Strings. -- -- Derived instances of Show have the following properties, which -- are compatible with derived instances of Read: -- --
-- infixr 5 :^: -- data Tree a = Leaf a | Tree a :^: Tree a ---- -- the derived instance of Show is equivalent to -- --
-- instance (Show a) => Show (Tree a) where -- -- showsPrec d (Leaf m) = showParen (d > app_prec) $ -- showString "Leaf " . showsPrec (app_prec+1) m -- where app_prec = 10 -- -- showsPrec d (u :^: v) = showParen (d > up_prec) $ -- showsPrec (up_prec+1) u . -- showString " :^: " . -- showsPrec (up_prec+1) v -- where up_prec = 5 ---- -- Note that right-associativity of :^: is ignored. For example, -- --
-- showsPrec d x r ++ s == showsPrec d x (r ++ s) ---- -- Derived instances of Read and Show satisfy the -- following: -- -- -- -- That is, readsPrec parses the string produced by -- showsPrec, and delivers the value that showsPrec started -- with. showsPrec :: Show a => Int -> a -> ShowS -- | A specialised variant of showsPrec, using precedence context -- zero, and returning an ordinary String. show :: Show a => a -> String -- | The method showList is provided to allow the programmer to give -- a specialised way of showing lists of values. For example, this is -- used by the predefined Show instance of the Char type, -- where values of type String should be shown in double quotes, -- rather than between square brackets. showList :: Show a => [a] -> ShowS -- | The Haskell 2010 type for exceptions in the IO monad. Any I/O -- operation may raise an IOException instead of returning a -- result. For a more general type of exception, including also those -- that arise in pure code, see Exception. -- -- In Haskell 2010, this is an opaque type. type IOError = IOException -- | The Bounded class is used to name the upper and lower limits of -- a type. Ord is not a superclass of Bounded since types -- that are not totally ordered may also have upper and lower bounds. -- -- The Bounded class may be derived for any enumeration type; -- minBound is the first constructor listed in the data -- declaration and maxBound is the last. Bounded may also -- be derived for single-constructor datatypes whose constituent types -- are in Bounded. class () => Bounded a minBound :: Bounded a => a maxBound :: Bounded a => a -- | Class Enum defines operations on sequentially ordered types. -- -- The enumFrom... methods are used in Haskell's translation of -- arithmetic sequences. -- -- Instances of Enum may be derived for any enumeration type -- (types whose constructors have no fields). The nullary constructors -- are assumed to be numbered left-to-right by fromEnum from -- 0 through n-1. See Chapter 10 of the Haskell -- Report for more details. -- -- For any type that is an instance of class Bounded as well as -- Enum, the following should hold: -- --
-- enumFrom x = enumFromTo x maxBound -- enumFromThen x y = enumFromThenTo x y bound -- where -- bound | fromEnum y >= fromEnum x = maxBound -- | otherwise = minBound --class () => Enum a -- | the successor of a value. For numeric types, succ adds 1. succ :: Enum a => a -> a -- | the predecessor of a value. For numeric types, pred subtracts -- 1. pred :: Enum a => a -> a -- | Convert from an Int. toEnum :: Enum a => Int -> a -- | Convert to an Int. It is implementation-dependent what -- fromEnum returns when applied to a value that is too large to -- fit in an Int. fromEnum :: Enum a => a -> Int -- | Used in Haskell's translation of [n..] with [n..] = -- enumFrom n, a possible implementation being enumFrom n = n : -- enumFrom (succ n). For example: -- --
enumFrom 4 :: [Integer] = [4,5,6,7,...]
enumFrom 6 :: [Int] = [6,7,8,9,...,maxBound :: -- Int]
enumFromThen 4 6 :: [Integer] = [4,6,8,10...]
enumFromThen 6 2 :: [Int] = [6,2,-2,-6,...,minBound :: -- Int]
enumFromTo 6 10 :: [Int] = [6,7,8,9,10]
enumFromTo 42 1 :: [Integer] = []
enumFromThenTo 4 2 -6 :: [Integer] = -- [4,2,0,-2,-4,-6]
enumFromThenTo 6 8 2 :: [Int] = []
-- do a <- as -- bs a --(>>=) :: Monad m => m a -> (a -> m b) -> m b -- | Sequentially compose two actions, discarding any value produced by the -- first, like sequencing operators (such as the semicolon) in imperative -- languages. -- -- 'as >> bs' can be understood as the do -- expression -- --
-- do as -- bs --(>>) :: Monad m => m a -> m b -> m b -- | Inject a value into the monadic type. return :: Monad m => a -> m a infixl 1 >>= infixl 1 >> -- | A type f is a Functor if it provides a function fmap -- which, given any types a and b lets you apply any -- function from (a -> b) to turn an f a into an -- f b, preserving the structure of f. Furthermore -- f needs to adhere to the following: -- -- -- -- Note, that the second law follows from the free theorem of the type -- fmap and the first law, so you need only check that the former -- condition holds. See -- https://www.schoolofhaskell.com/user/edwardk/snippets/fmap or -- https://github.com/quchen/articles/blob/master/second_functor_law.md -- for an explanation. class () => Functor (f :: Type -> Type) -- | fmap is used to apply a function of type (a -> b) -- to a value of type f a, where f is a functor, to produce a -- value of type f b. Note that for any type constructor with -- more than one parameter (e.g., Either), only the last type -- parameter can be modified with fmap (e.g., b in -- `Either a b`). -- -- Some type constructors with two parameters or more have a -- Bifunctor instance that allows both the last and the -- penultimate parameters to be mapped over. -- --
-- >>> fmap show Nothing -- Nothing -- -- >>> fmap show (Just 3) -- Just "3" ---- -- Convert from an Either Int Int to an Either Int -- String using show: -- --
-- >>> fmap show (Left 17) -- Left 17 -- -- >>> fmap show (Right 17) -- Right "17" ---- -- Double each element of a list: -- --
-- >>> fmap (*2) [1,2,3] -- [2,4,6] ---- -- Apply even to the second element of a pair: -- --
-- >>> fmap even (2,2) -- (2,True) ---- -- It may seem surprising that the function is only applied to the last -- element of the tuple compared to the list example above which applies -- it to every element in the list. To understand, remember that tuples -- are type constructors with multiple type parameters: a tuple of 3 -- elements (a,b,c) can also be written (,,) a b c and -- its Functor instance is defined for Functor ((,,) a -- b) (i.e., only the third parameter is free to be mapped over with -- fmap). -- -- It explains why fmap can be used with tuples containing -- values of different types as in the following example: -- --
-- >>> fmap even ("hello", 1.0, 4)
-- ("hello",1.0,True)
--
fmap :: Functor f => (a -> b) -> f a -> f b
-- | Replace all locations in the input with the same value. The default
-- definition is fmap . const, but this may be
-- overridden with a more efficient version.
--
-- -- >>> 'a' <$ Just 2 -- Just 'a' -- -- >>> 'a' <$ Nothing -- Nothing --(<$) :: Functor f => a -> f b -> f a infixl 4 <$ -- | Basic numeric class. -- -- The Haskell Report defines no laws for Num. However, -- (+) and (*) are customarily expected -- to define a ring and have the following properties: -- --
-- fail s >>= f = fail s ---- -- If your Monad is also MonadPlus, a popular definition is -- --
-- fail _ = mzero ---- -- fail s should be an action that runs in the monad itself, not -- an exception (except in instances of MonadIO). In particular, -- fail should not be implemented in terms of error. class Monad m => MonadFail (m :: Type -> Type) fail :: MonadFail m => String -> m a -- | A functor with application, providing operations to -- --
-- (<*>) = liftA2 id ---- --
-- liftA2 f x y = f <$> x <*> y ---- -- Further, any definition must satisfy the following: -- --
pure id <*> v = -- v
pure (.) <*> u -- <*> v <*> w = u <*> (v -- <*> w)
pure f <*> -- pure x = pure (f x)
u <*> pure y = -- pure ($ y) <*> u
-- forall x y. p (q x y) = f x . g y ---- -- it follows from the above that -- --
-- liftA2 p (liftA2 q u v) = liftA2 f u . liftA2 g v ---- -- If f is also a Monad, it should satisfy -- -- -- -- (which implies that pure and <*> satisfy the -- applicative functor laws). class Functor f => Applicative (f :: Type -> Type) -- | Lift a value. pure :: Applicative f => a -> f a -- | Sequential application. -- -- A few functors support an implementation of <*> that is -- more efficient than the default one. -- --
-- >>> data MyState = MyState {arg1 :: Foo, arg2 :: Bar, arg3 :: Baz}
--
--
-- -- >>> produceFoo :: Applicative f => f Foo ---- --
-- >>> produceBar :: Applicative f => f Bar -- -- >>> produceBaz :: Applicative f => f Baz ---- --
-- >>> mkState :: Applicative f => f MyState -- -- >>> mkState = MyState <$> produceFoo <*> produceBar <*> produceBaz --(<*>) :: Applicative f => f (a -> b) -> f a -> f b -- | Lift a binary function to actions. -- -- Some functors support an implementation of liftA2 that is more -- efficient than the default one. In particular, if fmap is an -- expensive operation, it is likely better to use liftA2 than to -- fmap over the structure and then use <*>. -- -- This became a typeclass method in 4.10.0.0. Prior to that, it was a -- function defined in terms of <*> and fmap. -- --
-- >>> liftA2 (,) (Just 3) (Just 5) -- Just (3,5) --liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c -- | Sequence actions, discarding the value of the first argument. -- --
-- >>> Just 2 *> Just 3 -- Just 3 ---- --
-- >>> Nothing *> Just 3 -- Nothing ---- -- Of course a more interesting use case would be to have effectful -- computations instead of just returning pure values. -- --
-- >>> import Data.Char
--
-- >>> import Text.ParserCombinators.ReadP
--
-- >>> let p = string "my name is " *> munch1 isAlpha <* eof
--
-- >>> readP_to_S p "my name is Simon"
-- [("Simon","")]
--
(*>) :: Applicative f => f a -> f b -> f b
-- | Sequence actions, discarding the value of the second argument.
(<*) :: Applicative f => f a -> f b -> f a
infixl 4 <*>
infixl 4 *>
infixl 4 <*
-- | The Foldable class represents data structures that can be reduced to a
-- summary value one element at a time. Strict left-associative folds are
-- a good fit for space-efficient reduction, while lazy right-associative
-- folds are a good fit for corecursive iteration, or for folds that
-- short-circuit after processing an initial subsequence of the
-- structure's elements.
--
-- Instances can be derived automatically by enabling the
-- DeriveFoldable extension. For example, a derived instance for
-- a binary tree might be:
--
--
-- {-# LANGUAGE DeriveFoldable #-}
-- data Tree a = Empty
-- | Leaf a
-- | Node (Tree a) a (Tree a)
-- deriving Foldable
--
--
-- A more detailed description can be found in the Overview
-- section of Data.Foldable#overview.
--
-- For the class laws see the Laws section of
-- Data.Foldable#laws.
class () => Foldable (t :: Type -> Type)
-- | Map each element of the structure into a monoid, and combine the
-- results with (<>). This fold is
-- right-associative and lazy in the accumulator. For strict
-- left-associative folds consider foldMap' instead.
--
--
-- >>> foldMap Sum [1, 3, 5]
-- Sum {getSum = 9}
--
--
--
-- >>> foldMap Product [1, 3, 5]
-- Product {getProduct = 15}
--
--
-- -- >>> foldMap (replicate 3) [1, 2, 3] -- [1,1,1,2,2,2,3,3,3] ---- -- When a Monoid's (<>) is lazy in its second -- argument, foldMap can return a result even from an unbounded -- structure. For example, lazy accumulation enables -- Data.ByteString.Builder to efficiently serialise large data -- structures and produce the output incrementally: -- --
-- >>> import qualified Data.ByteString.Lazy as L -- -- >>> import qualified Data.ByteString.Builder as B -- -- >>> let bld :: Int -> B.Builder; bld i = B.intDec i <> B.word8 0x20 -- -- >>> let lbs = B.toLazyByteString $ foldMap bld [0..] -- -- >>> L.take 64 lbs -- "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24" --foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m -- | Right-associative fold of a structure, lazy in the accumulator. -- -- In the case of lists, foldr, when applied to a binary operator, -- a starting value (typically the right-identity of the operator), and a -- list, reduces the list using the binary operator, from right to left: -- --
-- foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...) ---- -- Note that since the head of the resulting expression is produced by an -- application of the operator to the first element of the list, given an -- operator lazy in its right argument, foldr can produce a -- terminating expression from an unbounded list. -- -- For a general Foldable structure this should be semantically -- identical to, -- --
-- foldr f z = foldr f z . toList ---- --
-- >>> foldr (||) False [False, True, False] -- True ---- --
-- >>> foldr (||) False [] -- False ---- --
-- >>> foldr (\c acc -> acc ++ [c]) "foo" ['a', 'b', 'c', 'd'] -- "foodcba" ---- --
-- >>> foldr (||) False (True : repeat False) -- True ---- -- But the following doesn't terminate: -- --
-- >>> foldr (||) False (repeat False ++ [True]) -- * Hangs forever * ---- --
-- >>> take 5 $ foldr (\i acc -> i : fmap (+3) acc) [] (repeat 1) -- [1,4,7,10,13] --foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b -- | Left-associative fold of a structure, lazy in the accumulator. This is -- rarely what you want, but can work well for structures with efficient -- right-to-left sequencing and an operator that is lazy in its left -- argument. -- -- In the case of lists, foldl, when applied to a binary operator, -- a starting value (typically the left-identity of the operator), and a -- list, reduces the list using the binary operator, from left to right: -- --
-- foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn ---- -- Note that to produce the outermost application of the operator the -- entire input list must be traversed. Like all left-associative folds, -- foldl will diverge if given an infinite list. -- -- If you want an efficient strict left-fold, you probably want to use -- foldl' instead of foldl. The reason for this is that the -- latter does not force the inner results (e.g. z `f` x1 -- in the above example) before applying them to the operator (e.g. to -- (`f` x2)). This results in a thunk chain O(n) elements -- long, which then must be evaluated from the outside-in. -- -- For a general Foldable structure this should be semantically -- identical to: -- --
-- foldl f z = foldl f z . toList ---- --
-- >>> foldl (+) 42 [1,2,3,4] -- 52 ---- -- Though the result below is lazy, the input is reversed before -- prepending it to the initial accumulator, so corecursion begins only -- after traversing the entire input string. -- --
-- >>> foldl (\acc c -> c : acc) "abcd" "efgh" -- "hgfeabcd" ---- -- A left fold of a structure that is infinite on the right cannot -- terminate, even when for any finite input the fold just returns the -- initial accumulator: -- --
-- >>> foldl (\a _ -> a) 0 $ repeat 1 -- * Hangs forever * ---- -- WARNING: When it comes to lists, you always want to use either -- foldl' or foldr instead. foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b -- | A variant of foldr that has no base case, and thus may only be -- applied to non-empty structures. -- -- This function is non-total and will raise a runtime exception if the -- structure happens to be empty. -- --
-- >>> foldr1 (+) [1..4] -- 10 ---- --
-- >>> foldr1 (+) [] -- Exception: Prelude.foldr1: empty list ---- --
-- >>> foldr1 (+) Nothing -- *** Exception: foldr1: empty structure ---- --
-- >>> foldr1 (-) [1..4] -- -2 ---- --
-- >>> foldr1 (&&) [True, False, True, True] -- False ---- --
-- >>> foldr1 (||) [False, False, True, True] -- True ---- --
-- >>> foldr1 (+) [1..] -- * Hangs forever * --foldr1 :: Foldable t => (a -> a -> a) -> t a -> a -- | A variant of foldl that has no base case, and thus may only be -- applied to non-empty structures. -- -- This function is non-total and will raise a runtime exception if the -- structure happens to be empty. -- --
-- foldl1 f = foldl1 f . toList ---- --
-- >>> foldl1 (+) [1..4] -- 10 ---- --
-- >>> foldl1 (+) [] -- *** Exception: Prelude.foldl1: empty list ---- --
-- >>> foldl1 (+) Nothing -- *** Exception: foldl1: empty structure ---- --
-- >>> foldl1 (-) [1..4] -- -8 ---- --
-- >>> foldl1 (&&) [True, False, True, True] -- False ---- --
-- >>> foldl1 (||) [False, False, True, True] -- True ---- --
-- >>> foldl1 (+) [1..] -- * Hangs forever * --foldl1 :: Foldable t => (a -> a -> a) -> t a -> a -- | Test whether the structure is empty. The default implementation is -- Left-associative and lazy in both the initial element and the -- accumulator. Thus optimised for structures where the first element can -- be accessed in constant time. Structures where this is not the case -- should have a non-default implementation. -- --
-- >>> null [] -- True ---- --
-- >>> null [1] -- False ---- -- null is expected to terminate even for infinite structures. The -- default implementation terminates provided the structure is bounded on -- the left (there is a leftmost element). -- --
-- >>> null [1..] -- False --null :: Foldable t => t a -> Bool -- | Returns the size/length of a finite structure as an Int. The -- default implementation just counts elements starting with the -- leftmost. Instances for structures that can compute the element count -- faster than via element-by-element counting, should provide a -- specialised implementation. -- --
-- >>> length [] -- 0 ---- --
-- >>> length ['a', 'b', 'c'] -- 3 -- -- >>> length [1..] -- * Hangs forever * --length :: Foldable t => t a -> Int -- | Does the element occur in the structure? -- -- Note: elem is often used in infix form. -- --
-- >>> 3 `elem` [] -- False ---- --
-- >>> 3 `elem` [1,2] -- False ---- --
-- >>> 3 `elem` [1,2,3,4,5] -- True ---- -- For infinite structures, the default implementation of elem -- terminates if the sought-after value exists at a finite distance from -- the left side of the structure: -- --
-- >>> 3 `elem` [1..] -- True ---- --
-- >>> 3 `elem` ([4..] ++ [3]) -- * Hangs forever * --elem :: (Foldable t, Eq a) => a -> t a -> Bool infix 4 `elem` -- | Functors representing data structures that can be transformed to -- structures of the same shape by performing an -- Applicative (or, therefore, Monad) action on each -- element from left to right. -- -- A more detailed description of what same shape means, the -- various methods, how traversals are constructed, and example advanced -- use-cases can be found in the Overview section of -- Data.Traversable#overview. -- -- For the class laws see the Laws section of -- Data.Traversable#laws. class (Functor t, Foldable t) => Traversable (t :: Type -> Type) -- | Map each element of a structure to an action, evaluate these actions -- from left to right, and collect the results. For a version that -- ignores the results see traverse_. -- --
-- >>> traverse Just [1,2,3,4] -- Just [1,2,3,4] ---- --
-- >>> traverse id [Right 1, Right 2, Right 3, Right 4] -- Right [1,2,3,4] ---- -- In the next examples, we show that Nothing and Left -- values short circuit the created structure. -- --
-- >>> traverse (const Nothing) [1,2,3,4] -- Nothing ---- --
-- >>> traverse (\x -> if odd x then Just x else Nothing) [1,2,3,4] -- Nothing ---- --
-- >>> traverse id [Right 1, Right 2, Right 3, Right 4, Left 0] -- Left 0 --traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) -- | Evaluate each action in the structure from left to right, and collect -- the results. For a version that ignores the results see -- sequenceA_. -- --
-- >>> sequenceA [Just 1, Just 2, Just 3] -- Just [1,2,3] ---- --
-- >>> sequenceA [Right 1, Right 2, Right 3] -- Right [1,2,3] ---- -- The next two example show Nothing and Just will short -- circuit the resulting structure if present in the input. For more -- context, check the Traversable instances for Either and -- Maybe. -- --
-- >>> sequenceA [Just 1, Just 2, Just 3, Nothing] -- Nothing ---- --
-- >>> sequenceA [Right 1, Right 2, Right 3, Left 4] -- Left 4 --sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a) -- | Map each element of a structure to a monadic action, evaluate these -- actions from left to right, and collect the results. For a version -- that ignores the results see mapM_. -- --
-- >>> sequence $ Right [1,2,3,4] -- [Right 1,Right 2,Right 3,Right 4] ---- --
-- >>> sequence $ [Right 1,Right 2,Right 3,Right 4] -- Right [1,2,3,4] ---- -- The following examples demonstrate short circuit behavior for -- sequence. -- --
-- >>> sequence $ Left [1,2,3,4] -- Left [1,2,3,4] ---- --
-- >>> sequence $ [Left 0, Right 1,Right 2,Right 3,Right 4] -- Left 0 --sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) -- | The class of semigroups (types with an associative binary operation). -- -- Instances should satisfy the following: -- -- -- -- You can alternatively define sconcat instead of -- (<>), in which case the laws are: -- --
-- >>> [1,2,3] <> [4,5,6] -- [1,2,3,4,5,6] --(<>) :: Semigroup a => a -> a -> a infixr 6 <> -- | The class of monoids (types with an associative binary operation that -- has an identity). Instances should satisfy the following: -- --
-- >>> "Hello world" <> mempty -- "Hello world" --mempty :: Monoid a => a -- | An associative operation -- -- NOTE: This method is redundant and has the default -- implementation mappend = (<>) since -- base-4.11.0.0. Should it be implemented manually, since -- mappend is a synonym for (<>), it is expected that -- the two functions are defined the same way. In a future GHC release -- mappend will be removed from Monoid. mappend :: Monoid a => a -> a -> a -- | Fold a list using the monoid. -- -- For most types, the default definition for mconcat will be -- used, but the function is included in the class definition so that an -- optimized version can be provided for specific types. -- --
-- >>> mconcat ["Hello", " ", "Haskell", "!"] -- "Hello Haskell!" --mconcat :: Monoid a => [a] -> a -- | The shows functions return a function that prepends the -- output String to an existing String. This allows -- constant-time concatenation of results using function composition. type ShowS = String -> String -- | A parser for a type a, represented as a function that takes a -- String and returns a list of possible parses as -- (a,String) pairs. -- -- Note that this kind of backtracking parser is very inefficient; -- reading a large structure may be quite slow (cf ReadP). type ReadS a = String -> [(a, String)] -- | File and directory names are values of type String, whose -- precise meaning is operating system dependent. Files can be opened, -- yielding a handle which can then be used to operate on the contents of -- that file. type FilePath = String -- | error stops execution and displays an error message. error :: forall (r :: RuntimeRep) (a :: TYPE r). HasCallStack => [Char] -> a -- | <math>. zipWith generalises zip by zipping with -- the function given as the first argument, instead of a tupling -- function. -- --
-- zipWith (,) xs ys == zip xs ys -- zipWith f [x1,x2,x3..] [y1,y2,y3..] == [f x1 y1, f x2 y2, f x3 y3..] ---- -- For example, zipWith (+) is applied to two lists to -- produce the list of corresponding sums: -- --
-- >>> zipWith (+) [1, 2, 3] [4, 5, 6] -- [5,7,9] ---- -- zipWith is right-lazy: -- --
-- >>> let f = undefined -- -- >>> zipWith f [] undefined -- [] ---- -- zipWith is capable of list fusion, but it is restricted to its -- first list argument and its resulting list. zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] even :: Integral a => a -> Bool -- | An infix synonym for fmap. -- -- The name of this operator is an allusion to $. Note the -- similarities between their types: -- --
-- ($) :: (a -> b) -> a -> b -- (<$>) :: Functor f => (a -> b) -> f a -> f b ---- -- Whereas $ is function application, <$> is function -- application lifted over a Functor. -- --
-- >>> show <$> Nothing -- Nothing -- -- >>> show <$> Just 3 -- Just "3" ---- -- Convert from an Either Int Int to an -- Either Int String using show: -- --
-- >>> show <$> Left 17 -- Left 17 -- -- >>> show <$> Right 17 -- Right "17" ---- -- Double each element of a list: -- --
-- >>> (*2) <$> [1,2,3] -- [2,4,6] ---- -- Apply even to the second element of a pair: -- --
-- >>> even <$> (2,2) -- (2,True) --(<$>) :: Functor f => (a -> b) -> f a -> f b infixl 4 <$> -- | Application operator. This operator is redundant, since ordinary -- application (f x) means the same as (f $ x). -- However, $ has low, right-associative binding precedence, so it -- sometimes allows parentheses to be omitted; for example: -- --
-- f $ g $ h x = f (g (h x)) ---- -- It is also useful in higher-order situations, such as map -- ($ 0) xs, or zipWith ($) fs xs. -- -- Note that ($) is representation-polymorphic in its -- result type, so that foo $ True where foo :: Bool -- -> Int# is well-typed. ($) :: forall (r :: RuntimeRep) a (b :: TYPE r). (a -> b) -> a -> b infixr 0 $ -- | Extract the first component of a pair. fst :: (a, b) -> a -- | uncurry converts a curried function to a function on pairs. -- --
-- >>> uncurry (+) (1,2) -- 3 ---- --
-- >>> uncurry ($) (show, 1) -- "1" ---- --
-- >>> map (uncurry max) [(1,2), (3,4), (6,8)] -- [2,4,8] --uncurry :: (a -> b -> c) -> (a, b) -> c -- | <math>. Extract the first element of a list, which must be -- non-empty. -- --
-- >>> head [1, 2, 3] -- 1 -- -- >>> head [1..] -- 1 -- -- >>> head [] -- *** Exception: Prelude.head: empty list ---- -- WARNING: This function is partial. You can use case-matching, -- uncons or listToMaybe instead. head :: HasCallStack => [a] -> a -- | The computation writeFile file str function writes the -- string str, to the file file. writeFile :: FilePath -> String -> IO () -- | Read a line from the standard input device (same as hGetLine -- stdin). getLine :: IO String -- | The same as putStr, but adds a newline character. putStrLn :: String -> IO () -- | <math>. filter, applied to a predicate and a list, -- returns the list of those elements that satisfy the predicate; i.e., -- --
-- filter p xs = [ x | x <- xs, p x] ---- --
-- >>> filter odd [1, 2, 3] -- [1,3] --filter :: (a -> Bool) -> [a] -> [a] -- | cycle ties a finite list into a circular one, or equivalently, -- the infinite repetition of the original list. It is the identity on -- infinite lists. -- --
-- >>> cycle [] -- *** Exception: Prelude.cycle: empty list -- -- >>> cycle [42] -- [42,42,42,42,42,42,42,42,42,42... -- -- >>> cycle [2, 5, 7] -- [2,5,7,2,5,7,2,5,7,2,5,7... --cycle :: HasCallStack => [a] -> [a] -- | Append two lists, i.e., -- --
-- [x1, ..., xm] ++ [y1, ..., yn] == [x1, ..., xm, y1, ..., yn] -- [x1, ..., xm] ++ [y1, ...] == [x1, ..., xm, y1, ...] ---- -- If the first list is not finite, the result is the first list. -- -- WARNING: This function takes linear time in the number of elements of -- the first list. (++) :: [a] -> [a] -> [a] infixr 5 ++ -- | The value of seq a b is bottom if a is -- bottom, and otherwise equal to b. In other words, it -- evaluates the first argument a to weak head normal form -- (WHNF). seq is usually introduced to improve performance by -- avoiding unneeded laziness. -- -- A note on evaluation order: the expression seq a b -- does not guarantee that a will be evaluated before -- b. The only guarantee given by seq is that the both -- a and b will be evaluated before seq returns -- a value. In particular, this means that b may be evaluated -- before a. If you need to guarantee a specific order of -- evaluation, you must use the function pseq from the -- "parallel" package. seq :: forall {r :: RuntimeRep} a (b :: TYPE r). a -> b -> b infixr 0 `seq` -- | The concatenation of all the elements of a container of lists. -- --
-- >>> concat (Just [1, 2, 3]) -- [1,2,3] ---- --
-- >>> concat (Left 42) -- [] ---- --
-- >>> concat [[1, 2, 3], [4, 5], [6], []] -- [1,2,3,4,5,6] --concat :: Foldable t => t [a] -> [a] -- | <math>. zip takes two lists and returns a list of -- corresponding pairs. -- --
-- >>> zip [1, 2] ['a', 'b'] -- [(1,'a'),(2,'b')] ---- -- If one input list is shorter than the other, excess elements of the -- longer list are discarded, even if one of the lists is infinite: -- --
-- >>> zip [1] ['a', 'b'] -- [(1,'a')] -- -- >>> zip [1, 2] ['a'] -- [(1,'a')] -- -- >>> zip [] [1..] -- [] -- -- >>> zip [1..] [] -- [] ---- -- zip is right-lazy: -- --
-- >>> zip [] undefined -- [] -- -- >>> zip undefined [] -- *** Exception: Prelude.undefined -- ... ---- -- zip is capable of list fusion, but it is restricted to its -- first list argument and its resulting list. zip :: [a] -> [b] -> [(a, b)] -- | The print function outputs a value of any printable type to the -- standard output device. Printable types are those that are instances -- of class Show; print converts values to strings for -- output using the show operation and adds a newline. -- -- For example, a program to print the first 20 integers and their powers -- of 2 could be written as: -- --
-- main = print ([(n, 2^n) | n <- [0..19]]) --print :: Show a => a -> IO () -- | otherwise is defined as the value True. It helps to make -- guards more readable. eg. -- --
-- f x | x < 0 = ... -- | otherwise = ... --otherwise :: Bool -- | <math>. map f xs is the list obtained by -- applying f to each element of xs, i.e., -- --
-- map f [x1, x2, ..., xn] == [f x1, f x2, ..., f xn] -- map f [x1, x2, ...] == [f x1, f x2, ...] ---- --
-- >>> map (+1) [1, 2, 3] -- [2,3,4] --map :: (a -> b) -> [a] -> [b] -- | General coercion from Integral types. -- -- WARNING: This function performs silent truncation if the result type -- is not at least as big as the argument's type. fromIntegral :: (Integral a, Num b) => a -> b -- | General coercion to Fractional types. -- -- WARNING: This function goes through the Rational type, which -- does not have values for NaN for example. This means it does -- not round-trip. -- -- For Double it also behaves differently with or without -O0: -- --
-- Prelude> realToFrac nan -- With -O0 -- -Infinity -- Prelude> realToFrac nan -- NaN --realToFrac :: (Real a, Fractional b) => a -> b -- | Boolean "and", lazy in the second argument (&&) :: Bool -> Bool -> Bool infixr 3 && -- | Boolean "or", lazy in the second argument (||) :: Bool -> Bool -> Bool infixr 2 || -- | Boolean "not" not :: Bool -> Bool -- | A variant of error that does not produce a stack trace. errorWithoutStackTrace :: forall (r :: RuntimeRep) (a :: TYPE r). [Char] -> a -- | A special case of error. It is expected that compilers will -- recognize this and insert error messages which are more appropriate to -- the context in which undefined appears. undefined :: forall (r :: RuntimeRep) (a :: TYPE r). HasCallStack => a -- | Same as >>=, but with the arguments interchanged. (=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 =<< -- | const x y always evaluates to x, ignoring its second -- argument. -- --
-- >>> const 42 "hello" -- 42 ---- --
-- >>> map (const 42) [0..3] -- [42,42,42,42] --const :: a -> b -> a -- | flip f takes its (first) two arguments in the reverse -- order of f. -- --
-- >>> flip (++) "hello" "world" -- "worldhello" --flip :: (a -> b -> c) -> b -> a -> c -- | Strict (call-by-value) application operator. It takes a function and -- an argument, evaluates the argument to weak head normal form (WHNF), -- then calls the function with that value. ($!) :: forall (r :: RuntimeRep) a (b :: TYPE r). (a -> b) -> a -> b infixr 0 $! -- | until p f yields the result of applying f -- until p holds. until :: (a -> Bool) -> (a -> a) -> a -> a -- | asTypeOf is a type-restricted version of const. It is -- usually used as an infix operator, and its typing forces its first -- argument (which is usually overloaded) to have the same type as the -- second. asTypeOf :: a -> a -> a -- | the same as flip (-). -- -- Because - is treated specially in the Haskell grammar, -- (- e) is not a section, but an application of -- prefix negation. However, (subtract -- exp) is equivalent to the disallowed section. subtract :: Num a => a -> a -> a -- | The maybe function takes a default value, a function, and a -- Maybe value. If the Maybe value is Nothing, the -- function returns the default value. Otherwise, it applies the function -- to the value inside the Just and returns the result. -- --
-- >>> maybe False odd (Just 3) -- True ---- --
-- >>> maybe False odd Nothing -- False ---- -- Read an integer from a string using readMaybe. If we succeed, -- return twice the integer; that is, apply (*2) to it. If -- instead we fail to parse an integer, return 0 by default: -- --
-- >>> import Text.Read ( readMaybe ) -- -- >>> maybe 0 (*2) (readMaybe "5") -- 10 -- -- >>> maybe 0 (*2) (readMaybe "") -- 0 ---- -- Apply show to a Maybe Int. If we have Just n, -- we want to show the underlying Int n. But if we have -- Nothing, we return the empty string instead of (for example) -- "Nothing": -- --
-- >>> maybe "" show (Just 5) -- "5" -- -- >>> maybe "" show Nothing -- "" --maybe :: b -> (a -> b) -> Maybe a -> b -- | <math>. Extract the elements after the head of a list, which -- must be non-empty. -- --
-- >>> tail [1, 2, 3] -- [2,3] -- -- >>> tail [1] -- [] -- -- >>> tail [] -- *** Exception: Prelude.tail: empty list ---- -- WARNING: This function is partial. You can use case-matching or -- uncons instead. tail :: HasCallStack => [a] -> [a] -- | <math>. Extract the last element of a list, which must be finite -- and non-empty. -- --
-- >>> last [1, 2, 3] -- 3 -- -- >>> last [1..] -- * Hangs forever * -- -- >>> last [] -- *** Exception: Prelude.last: empty list ---- -- WARNING: This function is partial. You can use reverse with -- case-matching, uncons or listToMaybe instead. last :: HasCallStack => [a] -> a -- | <math>. Return all the elements of a list except the last one. -- The list must be non-empty. -- --
-- >>> init [1, 2, 3] -- [1,2] -- -- >>> init [1] -- [] -- -- >>> init [] -- *** Exception: Prelude.init: empty list ---- -- WARNING: This function is partial. You can use reverse with -- case-matching or uncons instead. init :: HasCallStack => [a] -> [a] -- | <math>. scanl is similar to foldl, but returns a -- list of successive reduced values from the left: -- --
-- scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...] ---- -- Note that -- --
-- last (scanl f z xs) == foldl f z xs ---- --
-- >>> scanl (+) 0 [1..4] -- [0,1,3,6,10] -- -- >>> scanl (+) 42 [] -- [42] -- -- >>> scanl (-) 100 [1..4] -- [100,99,97,94,90] -- -- >>> scanl (\reversedString nextChar -> nextChar : reversedString) "foo" ['a', 'b', 'c', 'd'] -- ["foo","afoo","bafoo","cbafoo","dcbafoo"] -- -- >>> scanl (+) 0 [1..] -- * Hangs forever * --scanl :: (b -> a -> b) -> b -> [a] -> [b] -- | <math>. scanl1 is a variant of scanl that has no -- starting value argument: -- --
-- scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...] ---- --
-- >>> scanl1 (+) [1..4] -- [1,3,6,10] -- -- >>> scanl1 (+) [] -- [] -- -- >>> scanl1 (-) [1..4] -- [1,-1,-4,-8] -- -- >>> scanl1 (&&) [True, False, True, True] -- [True,False,False,False] -- -- >>> scanl1 (||) [False, False, True, True] -- [False,False,True,True] -- -- >>> scanl1 (+) [1..] -- * Hangs forever * --scanl1 :: (a -> a -> a) -> [a] -> [a] -- | <math>. scanr is the right-to-left dual of scanl. -- Note that the order of parameters on the accumulating function are -- reversed compared to scanl. Also note that -- --
-- head (scanr f z xs) == foldr f z xs. ---- --
-- >>> scanr (+) 0 [1..4] -- [10,9,7,4,0] -- -- >>> scanr (+) 42 [] -- [42] -- -- >>> scanr (-) 100 [1..4] -- [98,-97,99,-96,100] -- -- >>> scanr (\nextChar reversedString -> nextChar : reversedString) "foo" ['a', 'b', 'c', 'd'] -- ["abcdfoo","bcdfoo","cdfoo","dfoo","foo"] -- -- >>> force $ scanr (+) 0 [1..] -- *** Exception: stack overflow --scanr :: (a -> b -> b) -> b -> [a] -> [b] -- | <math>. scanr1 is a variant of scanr that has no -- starting value argument. -- --
-- >>> scanr1 (+) [1..4] -- [10,9,7,4] -- -- >>> scanr1 (+) [] -- [] -- -- >>> scanr1 (-) [1..4] -- [-2,3,-1,4] -- -- >>> scanr1 (&&) [True, False, True, True] -- [False,False,True,True] -- -- >>> scanr1 (||) [True, True, False, False] -- [True,True,False,False] -- -- >>> force $ scanr1 (+) [1..] -- *** Exception: stack overflow --scanr1 :: (a -> a -> a) -> [a] -> [a] -- | iterate f x returns an infinite list of repeated -- applications of f to x: -- --
-- iterate f x == [x, f x, f (f x), ...] ---- -- Note that iterate is lazy, potentially leading to thunk -- build-up if the consumer doesn't force each iterate. See -- iterate' for a strict variant of this function. -- --
-- >>> take 10 $ iterate not True -- [True,False,True,False... -- -- >>> take 10 $ iterate (+3) 42 -- [42,45,48,51,54,57,60,63... --iterate :: (a -> a) -> a -> [a] -- | repeat x is an infinite list, with x the -- value of every element. -- --
-- >>> repeat 17 -- [17,17,17,17,17,17,17,17,17... --repeat :: a -> [a] -- | replicate n x is a list of length n with -- x the value of every element. It is an instance of the more -- general genericReplicate, in which n may be of any -- integral type. -- --
-- >>> replicate 0 True -- [] -- -- >>> replicate (-1) True -- [] -- -- >>> replicate 4 True -- [True,True,True,True] --replicate :: Int -> a -> [a] -- | takeWhile, applied to a predicate p and a list -- xs, returns the longest prefix (possibly empty) of -- xs of elements that satisfy p. -- --
-- >>> takeWhile (< 3) [1,2,3,4,1,2,3,4] -- [1,2] -- -- >>> takeWhile (< 9) [1,2,3] -- [1,2,3] -- -- >>> takeWhile (< 0) [1,2,3] -- [] --takeWhile :: (a -> Bool) -> [a] -> [a] -- | dropWhile p xs returns the suffix remaining after -- takeWhile p xs. -- --
-- >>> dropWhile (< 3) [1,2,3,4,5,1,2,3] -- [3,4,5,1,2,3] -- -- >>> dropWhile (< 9) [1,2,3] -- [] -- -- >>> dropWhile (< 0) [1,2,3] -- [1,2,3] --dropWhile :: (a -> Bool) -> [a] -> [a] -- | take n, applied to a list xs, returns the -- prefix of xs of length n, or xs itself if -- n >= length xs. -- --
-- >>> take 5 "Hello World!" -- "Hello" -- -- >>> take 3 [1,2,3,4,5] -- [1,2,3] -- -- >>> take 3 [1,2] -- [1,2] -- -- >>> take 3 [] -- [] -- -- >>> take (-1) [1,2] -- [] -- -- >>> take 0 [1,2] -- [] ---- -- It is an instance of the more general genericTake, in which -- n may be of any integral type. take :: Int -> [a] -> [a] -- | drop n xs returns the suffix of xs after the -- first n elements, or [] if n >= length -- xs. -- --
-- >>> drop 6 "Hello World!" -- "World!" -- -- >>> drop 3 [1,2,3,4,5] -- [4,5] -- -- >>> drop 3 [1,2] -- [] -- -- >>> drop 3 [] -- [] -- -- >>> drop (-1) [1,2] -- [1,2] -- -- >>> drop 0 [1,2] -- [1,2] ---- -- It is an instance of the more general genericDrop, in which -- n may be of any integral type. drop :: Int -> [a] -> [a] -- | splitAt n xs returns a tuple where first element is -- xs prefix of length n and second element is the -- remainder of the list: -- --
-- >>> splitAt 6 "Hello World!"
-- ("Hello ","World!")
--
-- >>> splitAt 3 [1,2,3,4,5]
-- ([1,2,3],[4,5])
--
-- >>> splitAt 1 [1,2,3]
-- ([1],[2,3])
--
-- >>> splitAt 3 [1,2,3]
-- ([1,2,3],[])
--
-- >>> splitAt 4 [1,2,3]
-- ([1,2,3],[])
--
-- >>> splitAt 0 [1,2,3]
-- ([],[1,2,3])
--
-- >>> splitAt (-1) [1,2,3]
-- ([],[1,2,3])
--
--
-- It is equivalent to (take n xs, drop n xs) when
-- n is not _|_ (splitAt _|_ xs = _|_).
-- splitAt is an instance of the more general
-- genericSplitAt, in which n may be of any integral
-- type.
splitAt :: Int -> [a] -> ([a], [a])
-- | span, applied to a predicate p and a list xs,
-- returns a tuple where first element is longest prefix (possibly empty)
-- of xs of elements that satisfy p and second element
-- is the remainder of the list:
--
-- -- >>> span (< 3) [1,2,3,4,1,2,3,4] -- ([1,2],[3,4,1,2,3,4]) -- -- >>> span (< 9) [1,2,3] -- ([1,2,3],[]) -- -- >>> span (< 0) [1,2,3] -- ([],[1,2,3]) ---- -- span p xs is equivalent to (takeWhile p xs, -- dropWhile p xs) span :: (a -> Bool) -> [a] -> ([a], [a]) -- | break, applied to a predicate p and a list -- xs, returns a tuple where first element is longest prefix -- (possibly empty) of xs of elements that do not satisfy -- p and second element is the remainder of the list: -- --
-- >>> break (> 3) [1,2,3,4,1,2,3,4] -- ([1,2,3],[4,1,2,3,4]) -- -- >>> break (< 9) [1,2,3] -- ([],[1,2,3]) -- -- >>> break (> 9) [1,2,3] -- ([1,2,3],[]) ---- -- break p is equivalent to span (not . -- p). break :: (a -> Bool) -> [a] -> ([a], [a]) -- | reverse xs returns the elements of xs in -- reverse order. xs must be finite. -- --
-- >>> reverse [] -- [] -- -- >>> reverse [42] -- [42] -- -- >>> reverse [2,5,7] -- [7,5,2] -- -- >>> reverse [1..] -- * Hangs forever * --reverse :: [a] -> [a] -- | and returns the conjunction of a container of Bools. For the -- result to be True, the container must be finite; False, -- however, results from a False value finitely far from the left -- end. -- --
-- >>> and [] -- True ---- --
-- >>> and [True] -- True ---- --
-- >>> and [False] -- False ---- --
-- >>> and [True, True, False] -- False ---- --
-- >>> and (False : repeat True) -- Infinite list [False,True,True,True,... -- False ---- --
-- >>> and (repeat True) -- * Hangs forever * --and :: Foldable t => t Bool -> Bool -- | or returns the disjunction of a container of Bools. For the -- result to be False, the container must be finite; True, -- however, results from a True value finitely far from the left -- end. -- --
-- >>> or [] -- False ---- --
-- >>> or [True] -- True ---- --
-- >>> or [False] -- False ---- --
-- >>> or [True, True, False] -- True ---- --
-- >>> or (True : repeat False) -- Infinite list [True,False,False,False,... -- True ---- --
-- >>> or (repeat False) -- * Hangs forever * --or :: Foldable t => t Bool -> Bool -- | Determines whether any element of the structure satisfies the -- predicate. -- --
-- >>> any (> 3) [] -- False ---- --
-- >>> any (> 3) [1,2] -- False ---- --
-- >>> any (> 3) [1,2,3,4,5] -- True ---- --
-- >>> any (> 3) [1..] -- True ---- --
-- >>> any (> 3) [0, -1..] -- * Hangs forever * --any :: Foldable t => (a -> Bool) -> t a -> Bool -- | Determines whether all elements of the structure satisfy the -- predicate. -- --
-- >>> all (> 3) [] -- True ---- --
-- >>> all (> 3) [1,2] -- False ---- --
-- >>> all (> 3) [1,2,3,4,5] -- False ---- --
-- >>> all (> 3) [1..] -- False ---- --
-- >>> all (> 3) [4..] -- * Hangs forever * --all :: Foldable t => (a -> Bool) -> t a -> Bool -- | notElem is the negation of elem. -- --
-- >>> 3 `notElem` [] -- True ---- --
-- >>> 3 `notElem` [1,2] -- True ---- --
-- >>> 3 `notElem` [1,2,3,4,5] -- False ---- -- For infinite structures, notElem terminates if the value exists -- at a finite distance from the left side of the structure: -- --
-- >>> 3 `notElem` [1..] -- False ---- --
-- >>> 3 `notElem` ([4..] ++ [3]) -- * Hangs forever * --notElem :: (Foldable t, Eq a) => a -> t a -> Bool infix 4 `notElem` -- | <math>. lookup key assocs looks up a key in an -- association list. For the result to be Nothing, the list must -- be finite. -- --
-- >>> lookup 2 [] -- Nothing -- -- >>> lookup 2 [(1, "first")] -- Nothing -- -- >>> lookup 2 [(1, "first"), (2, "second"), (3, "third")] -- Just "second" --lookup :: Eq a => a -> [(a, b)] -> Maybe b -- | Map a function over all the elements of a container and concatenate -- the resulting lists. -- --
-- >>> concatMap (take 3) [[1..], [10..], [100..], [1000..]] -- [1,2,3,10,11,12,100,101,102,1000,1001,1002] ---- --
-- >>> concatMap (take 3) (Just [1..]) -- [1,2,3] --concatMap :: Foldable t => (a -> [b]) -> t a -> [b] -- | List index (subscript) operator, starting from 0. It is an instance of -- the more general genericIndex, which takes an index of any -- integral type. -- --
-- >>> ['a', 'b', 'c'] !! 0 -- 'a' -- -- >>> ['a', 'b', 'c'] !! 2 -- 'c' -- -- >>> ['a', 'b', 'c'] !! 3 -- *** Exception: Prelude.!!: index too large -- -- >>> ['a', 'b', 'c'] !! (-1) -- *** Exception: Prelude.!!: negative index ---- -- WARNING: This function is partial. You can use atMay instead. (!!) :: HasCallStack => [a] -> Int -> a infixl 9 !! -- | zip3 takes three lists and returns a list of triples, analogous -- to zip. It is capable of list fusion, but it is restricted to -- its first list argument and its resulting list. zip3 :: [a] -> [b] -> [c] -> [(a, b, c)] -- | The zipWith3 function takes a function which combines three -- elements, as well as three lists and returns a list of the function -- applied to corresponding elements, analogous to zipWith. It is -- capable of list fusion, but it is restricted to its first list -- argument and its resulting list. -- --
-- zipWith3 (,,) xs ys zs == zip3 xs ys zs -- zipWith3 f [x1,x2,x3..] [y1,y2,y3..] [z1,z2,z3..] == [f x1 y1 z1, f x2 y2 z2, f x3 y3 z3..] --zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] -- | unzip transforms a list of pairs into a list of first -- components and a list of second components. -- --
-- >>> unzip [] -- ([],[]) -- -- >>> unzip [(1, 'a'), (2, 'b')] -- ([1,2],"ab") --unzip :: [(a, b)] -> ([a], [b]) -- | The unzip3 function takes a list of triples and returns three -- lists, analogous to unzip. -- --
-- >>> unzip3 [] -- ([],[],[]) -- -- >>> unzip3 [(1, 'a', True), (2, 'b', False)] -- ([1,2],"ab",[True,False]) --unzip3 :: [(a, b, c)] -> ([a], [b], [c]) -- | equivalent to showsPrec with a precedence of 0. shows :: Show a => a -> ShowS -- | utility function converting a Char to a show function that -- simply prepends the character unchanged. showChar :: Char -> ShowS -- | utility function converting a String to a show function that -- simply prepends the string unchanged. showString :: String -> ShowS -- | utility function that surrounds the inner show function with -- parentheses when the Bool parameter is True. showParen :: Bool -> ShowS -> ShowS odd :: Integral a => a -> Bool -- | raise a number to an integral power (^^) :: (Fractional a, Integral b) => a -> b -> a infixr 8 ^^ -- | gcd x y is the non-negative factor of both x -- and y of which every common factor of x and -- y is also a factor; for example gcd 4 2 = 2, -- gcd (-4) 6 = 2, gcd 0 4 = 4. -- gcd 0 0 = 0. (That is, the common divisor -- that is "greatest" in the divisibility preordering.) -- -- Note: Since for signed fixed-width integer types, abs -- minBound < 0, the result may be negative if one of the -- arguments is minBound (and necessarily is if the other -- is 0 or minBound) for such types. gcd :: Integral a => a -> a -> a -- | lcm x y is the smallest positive integer that both -- x and y divide. lcm :: Integral a => a -> a -> a -- | Extract the second component of a pair. snd :: (a, b) -> b -- | curry converts an uncurried function to a curried function. -- --
-- >>> curry fst 1 2 -- 1 --curry :: ((a, b) -> c) -> a -> b -> c -- | The lex function reads a single lexeme from the input, -- discarding initial white space, and returning the characters that -- constitute the lexeme. If the input string contains only white space, -- lex returns a single successful `lexeme' consisting of the -- empty string. (Thus lex "" = [("","")].) If there is -- no legal lexeme at the beginning of the input string, lex fails -- (i.e. returns []). -- -- This lexer is not completely faithful to the Haskell lexical syntax in -- the following respects: -- --
-- >>> let s = Left "foo" :: Either String Int -- -- >>> let n = Right 3 :: Either String Int -- -- >>> either length (*2) s -- 3 -- -- >>> either length (*2) n -- 6 --either :: (a -> c) -> (b -> c) -> Either a b -> c -- | equivalent to readsPrec with a precedence of 0. reads :: Read a => ReadS a -- | The read function reads input from a string, which must be -- completely consumed by the input process. read fails with an -- error if the parse is unsuccessful, and it is therefore -- discouraged from being used in real applications. Use readMaybe -- or readEither for safe alternatives. -- --
-- >>> read "123" :: Int -- 123 ---- --
-- >>> read "hello" :: Int -- *** Exception: Prelude.read: no parse --read :: Read a => String -> a -- | Map each element of a structure to a monadic action, evaluate these -- actions from left to right, and ignore the results. For a version that -- doesn't ignore the results see mapM. -- -- mapM_ is just like traverse_, but specialised to monadic -- actions. mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m () -- | Evaluate each monadic action in the structure from left to right, and -- ignore the results. For a version that doesn't ignore the results see -- sequence. -- -- sequence_ is just like sequenceA_, but specialised to -- monadic actions. sequence_ :: (Foldable t, Monad m) => t (m a) -> m () -- | Splits the argument into a list of lines stripped of their -- terminating \n characters. The \n terminator is -- optional in a final non-empty line of the argument string. -- -- For example: -- --
-- >>> lines "" -- empty input contains no lines -- [] -- -- >>> lines "\n" -- single empty line -- [""] -- -- >>> lines "one" -- single unterminated line -- ["one"] -- -- >>> lines "one\n" -- single non-empty line -- ["one"] -- -- >>> lines "one\n\n" -- second line is empty -- ["one",""] -- -- >>> lines "one\ntwo" -- second line is unterminated -- ["one","two"] -- -- >>> lines "one\ntwo\n" -- two non-empty lines -- ["one","two"] ---- -- When the argument string is empty, or ends in a \n character, -- it can be recovered by passing the result of lines to the -- unlines function. Otherwise, unlines appends the missing -- terminating \n. This makes unlines . lines -- idempotent: -- --
-- (unlines . lines) . (unlines . lines) = (unlines . lines) --lines :: String -> [String] -- | Appends a \n character to each input string, then -- concatenates the results. Equivalent to foldMap (s -> -- s ++ "\n"). -- --
-- >>> unlines ["Hello", "World", "!"] -- "Hello\nWorld\n!\n" ---- -- Note that unlines . lines /= -- id when the input is not \n-terminated: -- --
-- >>> unlines . lines $ "foo\nbar" -- "foo\nbar\n" --unlines :: [String] -> String -- | words breaks a string up into a list of words, which were -- delimited by white space (as defined by isSpace). This function -- trims any white spaces at the beginning and at the end. -- --
-- >>> words "Lorem ipsum\ndolor" -- ["Lorem","ipsum","dolor"] -- -- >>> words " foo bar " -- ["foo","bar"] --words :: String -> [String] -- | unwords joins words with separating spaces (U+0020 SPACE). -- --
-- >>> unwords ["Lorem", "ipsum", "dolor"] -- "Lorem ipsum dolor" ---- -- unwords is neither left nor right inverse of words: -- --
-- >>> words (unwords [" "]) -- [] -- -- >>> unwords (words "foo\nbar") -- "foo bar" --unwords :: [String] -> String -- | Construct an IOException value with a string describing the -- error. The fail method of the IO instance of the -- Monad class raises a userError, thus: -- --
-- instance Monad IO where -- ... -- fail s = ioError (userError s) --userError :: String -> IOError -- | Raise an IOException in the IO monad. ioError :: IOError -> IO a -- | Write a character to the standard output device (same as -- hPutChar stdout). putChar :: Char -> IO () -- | Write a string to the standard output device (same as hPutStr -- stdout). putStr :: String -> IO () -- | Read a character from the standard input device (same as -- hGetChar stdin). getChar :: IO Char -- | The getContents operation returns all user input as a single -- string, which is read lazily as it is needed (same as -- hGetContents stdin). getContents :: IO String -- | The interact function takes a function of type -- String->String as its argument. The entire input from the -- standard input device is passed to this function as its argument, and -- the resulting string is output on the standard output device. interact :: (String -> String) -> IO () -- | The readFile function reads a file and returns the contents of -- the file as a string. The file is read lazily, on demand, as with -- getContents. readFile :: FilePath -> IO String -- | The computation appendFile file str function appends -- the string str, to the file file. -- -- Note that writeFile and appendFile write a literal -- string to a file. To write a value of any printable type, as with -- print, use the show function to convert the value to a -- string first. -- --
-- main = appendFile "squares" (show [(x,x*x) | x <- [0,0.1..2]]) --appendFile :: FilePath -> String -> IO () -- | The readLn function combines getLine and readIO. readLn :: Read a => IO a -- | The readIO function is similar to read except that it -- signals parse failure to the IO monad instead of terminating -- the program. readIO :: Read a => String -> IO a -- |
-- >>> 1 *~ percent -- 1.0e-2 --percent :: Fractional a => Unit 'NonMetric DOne 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 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 === 365.25 *~ day ---- --
-- >>> 1 *~ year -- 3.15576e7 s ---- --
-- >>> 1 *~ year :: Time Rational -- 31557600 % 1 s --year :: Num a => Unit 'NonMetric DTime a -- | One Julian decade is ten Julian years. -- --
-- 1 *~ decade === 10 *~ year ---- --
-- >>> 1 *~ decade -- 3.15576e8 s ---- --
-- >>> 1 *~ decade :: Time Rational -- 315576000 % 1 s --decade :: Num a => Unit 'NonMetric DTime a -- | One Julian century is one hundred Julian years, or 35 525 -- days of 86 400 seconds each. -- --
-- 1 *~ century === 100 *~ year ---- --
-- 1 *~ century === 36525 *~ day ---- --
-- >>> 1 *~ century -- 3.15576e9 s ---- --
-- >>> 1 *~ century :: Time Rational -- 3155760000 % 1 s --century :: Num a => Unit 'NonMetric DTime a -- | One Julian millennium is one thousand Julian years. -- --
-- 1 *~ millennium === 1000 *~ year ---- --
-- >>> 1 *~ millennium -- 3.15576e10 s ---- --
-- >>> 1 *~ millennium :: Time Rational -- 31557600000 % 1 s --millennium :: 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 packages 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 dimensional value, either a Quantity or a Unit, -- parameterized by its Dimension and representation. data Dimensional v :: Dimension -> Type -> Type -- | 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: -- --