-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Statically checked physical dimensions, -- using Type Families and Data Kinds. -- -- Dimensional is a library providing data types for performing -- arithmetic with physical quantities and units. Information about the -- physical dimensions of the quantities and units is embedded in their -- types and the validity of operations is verified by the type checker -- at compile time. The boxing and unboxing of numerical values as -- quantities is done by multiplication and division with units. The -- library is designed to, as far as is practical, enforce/encourage best -- practices of unit usage. Version 1 of the dimensional package differs -- from earlier version in that the dimension tracking is implemented -- using Closed Type Families and Data Kinds rather than functional -- dependencies. This enables a number of features, including improved -- support for unit names and quantities with statically-unknown -- dimensions. Requires GHC 8.0 or later. @package dimensional @version 1.2 -- | This module defines physical dimensions expressed in terms of the SI -- base dimensions, including arithmetic. module Numeric.Units.Dimensional.Dimensions.TermLevel -- | A physical dimension, encoded as 7 integers, representing a -- factorization of the dimension into the 7 SI base dimensions. By -- convention they are stored in the same order as in the -- Dimension data kind. data Dimension' Dim' :: !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> !Int -> Dimension' -- | Dimensional values inhabit this class, which allows access to a -- term-level representation of their dimension. class HasDynamicDimension a => HasDimension a -- | Obtains a term-level representation of a value's dimension. dimension :: HasDimension a => a -> Dimension' -- | Dimensional values, or those that are only possibly dimensional, -- inhabit this class, which allows access to a term-level representation -- of their dimension. class HasDynamicDimension a -- | Gets the 'DynamicDimension of a dynamic dimensional value, which may -- be NoDimension if it does not represent a dimensional value of -- any Dimension. -- -- A default implementation is available for types that are also in the -- HasDimension typeclass. dynamicDimension :: HasDynamicDimension a => a -> DynamicDimension -- | Gets the 'DynamicDimension of a dynamic dimensional value, which may -- be NoDimension if it does not represent a dimensional value of -- any Dimension. -- -- A default implementation is available for types that are also in the -- HasDimension typeclass. dynamicDimension :: (HasDynamicDimension a, HasDimension a) => a -> DynamicDimension -- | The dimension of a dynamic value, which may not have any dimension at -- all. data DynamicDimension -- | The value has no valid dimension. NoDimension :: DynamicDimension -- | The value has the given dimension. SomeDimension :: Dimension' -> DynamicDimension -- | The value may be interpreted as having any dimension. AnyDimension :: DynamicDimension -- | Forms the product of two dimensions. (*) :: Dimension' -> Dimension' -> Dimension' infixl 7 * -- | Forms the quotient of two dimensions. (/) :: Dimension' -> Dimension' -> Dimension' infixl 7 / -- | Raises a dimension to an integer power. (^) :: Dimension' -> Int -> Dimension' infixr 8 ^ -- | Forms the reciprocal of a dimension. recip :: Dimension' -> Dimension' -- | Takes the nth root of a dimension, if it exists. -- -- n must not be zero. -- --
-- nroot (negate n) d == nroot n (recip d) --nroot :: Int -> Dimension' -> Maybe Dimension' -- | Takes the square root of a dimension, if it exists. -- --
-- sqrt d == nroot 2 d --sqrt :: Dimension' -> Maybe Dimension' -- | Takes the cube root of a dimension, if it exists. -- --
-- cbrt d == nroot 3 d --cbrt :: Dimension' -> Maybe Dimension' -- | The dimension of dimensionless values. dOne :: Dimension' dLength :: Dimension' dMass :: Dimension' dTime :: Dimension' dElectricCurrent :: Dimension' dThermodynamicTemperature :: Dimension' dAmountOfSubstance :: Dimension' dLuminousIntensity :: Dimension' -- | Converts a dimension to a list of 7 integers, representing the -- exponent associated with each of the 7 SI base dimensions in the -- standard order. asList :: Dimension' -> [Int] -- | Combines two DynamicDimensions, determining the -- DynamicDimension of a quantity that must match both inputs. -- -- This is the lattice meet operation for DynamicDimension. matchDimensions :: DynamicDimension -> DynamicDimension -> DynamicDimension -- | Determines if a value that has a DynamicDimension is compatible -- with a specified Dimension'. isCompatibleWith :: HasDynamicDimension a => a -> Dimension' -> Bool -- | Determines if a value that has a DynamicDimension in fact has -- any valid dimension at all. hasSomeDimension :: HasDynamicDimension a => a -> Bool instance GHC.Generics.Generic Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance Data.Data.Data Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Show.Show Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Classes.Ord Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Classes.Eq Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance GHC.Generics.Generic Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Data.Data.Data Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Classes.Ord Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Classes.Eq Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance GHC.Show.Show Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDynamicDimension Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Numeric.Units.Dimensional.Dimensions.TermLevel.HasDimension Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance Control.DeepSeq.NFData Numeric.Units.Dimensional.Dimensions.TermLevel.DynamicDimension instance Control.DeepSeq.NFData Numeric.Units.Dimensional.Dimensions.TermLevel.Dimension' instance 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 Prelude.Double -- v = 90 *~ (kilo meter / hour) ---- -- It follows naturally that the numerical value of a quantity is -- obtained by division by a unit. -- --
-- numval :: Prelude.Double -- numval = v /~ (meter / second) ---- -- The notion of a quantity as the product of a numerical value and a -- unit is supported by 7.1 "Value and numerical value of a quantity" of -- [1]. While the above syntax is fairly natural it is unfortunate -- that it must violate a number of the guidelines in [1], in -- particular 9.3 "Spelling unit names with prefixes", 9.4 "Spelling unit -- names obtained by multiplication", 9.5 "Spelling unit names obtained -- by division". -- -- As a more elaborate example of how to use the module we define a -- function for calculating the escape velocity of a celestial body -- [2]. -- --
-- escapeVelocity :: (Floating a) => Mass a -> Length a -> Velocity a -- escapeVelocity m r = sqrt (two * g * m / r) -- where -- two = 2 *~ one -- g = 6.6720e-11 *~ (newton * meter ^ pos2 / kilo gram ^ pos2) ---- -- For completeness we should also show an example of the error messages -- we will get from GHC when performing invalid arithmetic. In the best -- case GHC will be able to use the type synonyms we have defined in its -- error messages. -- --
-- let x = 1 *~ meter + 1 *~ second -- -- Couldn't match type 'Numeric.NumType.DK.Integers.Zero -- with 'Numeric.NumType.DK.Integers.Pos1 -- Expected type: Unit 'Metric DLength a -- Actual type: Unit 'Metric DTime a -- In the second argument of `(*~)', namely `second' -- In the second argument of `(+)', namely `1 *~ second' ---- -- In other cases the error messages aren't very friendly. -- --
-- let x = 1 *~ meter / (1 *~ second) + 1 *~ kilo gram
--
-- Couldn't match type 'Numeric.NumType.DK.Integers.Zero
-- with 'Numeric.NumType.DK.Integers.Neg1
-- Expected type: Quantity DMass a
-- Actual type: Dimensional
-- ('DQuantity V.* 'DQuantity) (DLength / DTime) a
-- In the first argument of `(+)', namely `1 *~ meter / (1 *~ second)'
-- In the expression: 1 *~ meter / (1 *~ second) + 1 *~ kilo gram
-- In an equation for `x':
-- x = 1 *~ meter / (1 *~ second) + 1 *~ kilo gram
--
--
-- It is the author's experience that the usefulness of the compiler
-- error messages is more often than not limited to pinpointing the
-- location of errors.
--
-- -- abs x * signum x == x ---- -- The sign is either negate _1 (negative), _0 (zero), -- or _1 (positive). signum :: Num a => Quantity d a -> Dimensionless a -- | Forms the reciprocal of a Quantity, which has the reciprocal -- dimension. -- --
-- >>> recip $ 47 *~ hertz -- 2.127659574468085e-2 s --recip :: Fractional a => Quantity d a -> Quantity (Recip d) a -- | Computes the nth root of a Quantity using **. -- -- The NRoot type family will prevent application of this operator -- where the result would have a fractional dimension or where n is zero. -- -- Because the root chosen impacts the Dimension of the result, it -- is necessary to supply a type-level representation of the root in the -- form of a Proxy to some TypeInt. Convenience values -- pos1, pos2, neg1, ... are supplied by the -- Numeric.NumType.DK.Integers module. The most commonly used ones -- are also reexported by Numeric.Units.Dimensional.Prelude. -- -- n must not be zero. Negative roots are defined such that nroot -- (Proxy :: Proxy (Negate n)) x == nroot (Proxy :: Proxy n) (recip -- x). -- -- Also available in operator form, see ^/. nroot :: (KnownTypeInt n, Floating a) => Proxy n -> Quantity d a -> Quantity (NRoot d n) a -- | Computes the square root of a Quantity using **. -- -- The NRoot type family will prevent application where the -- supplied quantity does not have a square dimension. -- --
-- (x :: Area Double) >= _0 ==> sqrt x == nroot pos2 x --sqrt :: Floating a => Quantity d a -> Quantity (Sqrt d) a -- | Computes the cube root of a Quantity using **. -- -- The NRoot type family will prevent application where the -- supplied quantity does not have a cubic dimension. -- --
-- (x :: Volume Double) >= _0 ==> cbrt x == nroot pos3 x --cbrt :: Floating a => Quantity d a -> Quantity (Cbrt d) a exp :: Floating a => Dimensionless a -> Dimensionless a log :: Floating a => Dimensionless a -> Dimensionless a -- | Takes the logarithm of the second argument in the base of the first. -- --
-- >>> logBase _2 _8 -- 3.0 --logBase :: Floating a => Dimensionless a -> Dimensionless a -> Dimensionless a sin :: Floating a => Dimensionless a -> Dimensionless a cos :: Floating a => Dimensionless a -> Dimensionless a tan :: Floating a => Dimensionless a -> Dimensionless a asin :: Floating a => Dimensionless a -> Dimensionless a acos :: Floating a => Dimensionless a -> Dimensionless a atan :: Floating a => Dimensionless a -> Dimensionless a sinh :: Floating a => Dimensionless a -> Dimensionless a cosh :: Floating a => Dimensionless a -> Dimensionless a tanh :: Floating a => Dimensionless a -> Dimensionless a asinh :: Floating a => Dimensionless a -> Dimensionless a acosh :: Floating a => Dimensionless a -> Dimensionless a atanh :: Floating a => Dimensionless a -> Dimensionless a -- | The standard two argument arctangent function. Since it interprets its -- two arguments in comparison with one another, the input may have any -- dimension. -- --
-- >>> atan2 _0 _1 -- 0.0 ---- --
-- >>> atan2 _1 _0 -- 1.5707963267948966 ---- --
-- >>> atan2 _0 (negate _1) -- 3.141592653589793 ---- --
-- >>> atan2 (negate _1) _0 -- -1.5707963267948966 --atan2 :: RealFloat a => Quantity d a -> Quantity d a -> Dimensionless a -- | Applies *~ to all values in a functor. (*~~) :: (Functor f, Num a) => f a -> Unit m d a -> f (Quantity d a) infixl 7 *~~ -- | Applies /~ to all values in a functor. (/~~) :: forall f m d a. (Functor f, Fractional a) => f (Quantity d a) -> Unit m d a -> f a infixl 7 /~~ -- | The sum of all elements in a foldable structure. -- --
-- >>> sum ([] :: [Mass Double]) -- 0.0 kg ---- --
-- >>> sum [12.4 *~ meter, 1 *~ foot] -- 12.7048 m --sum :: (Num a, Foldable f) => f (Quantity d a) -> Quantity d a -- | The arithmetic mean of all elements in a foldable structure. -- --
-- >>> mean [pi, _7] -- 5.070796326794897 --mean :: (Fractional a, Foldable f) => f (Quantity d a) -> Quantity d a -- | The product of all elements in a foldable structure. -- --
-- >>> product ([] :: [Dimensionless Double]) -- 1.0 ---- --
-- >>> product [pi, _4, 0.36 *~ one] -- 4.523893421169302 --product :: (Num a, Foldable f) => f (Dimensionless a) -> Dimensionless a -- | The length of the foldable data structure as a Dimensionless. -- This can be useful for purposes of e.g. calculating averages. -- --
-- >>> dimensionlessLength ["foo", "bar"] -- 2 --dimensionlessLength :: (Num a, Foldable f) => f b -> Dimensionless a -- | Returns a list of quantities between given bounds. -- --
-- n <= 0 ==> nFromTo (x :: Mass Double) (y :: Mass Double) n == [x, y] ---- --
-- (x :: Length Double) <= (y :: Length Double) ==> all (\z -> x <= z && z <= y) (nFromTo x y n) ---- --
-- >>> nFromTo _0 _3 2 -- [0.0,1.0,2.0,3.0] ---- --
-- >>> nFromTo _1 _0 7 -- [1.0,0.875,0.75,0.625,0.5,0.375,0.25,0.125,0.0] ---- --
-- >>> nFromTo _0 _1 (-5) -- [0.0,1.0] --nFromTo :: (Fractional a, Integral b) => Quantity d a -> Quantity d a -> b -> [Quantity d a] -- | The type-level dimension of dimensionless values. type DOne = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DLength = 'Dim 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero type DMass = 'Dim 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero 'Zero type DTime = 'Dim 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero 'Zero type DElectricCurrent = 'Dim 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero 'Zero type DThermodynamicTemperature = 'Dim 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero 'Zero type DAmountOfSubstance = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 'Zero type DLuminousIntensity = 'Dim 'Zero 'Zero 'Zero 'Zero 'Zero 'Zero 'Pos1 type Dimensionless = Quantity DOne type Length = Quantity DLength type Mass = Quantity DMass type Time = Quantity DTime type ElectricCurrent = Quantity DElectricCurrent type ThermodynamicTemperature = Quantity DThermodynamicTemperature type AmountOfSubstance = Quantity DAmountOfSubstance type LuminousIntensity = Quantity DLuminousIntensity -- | The constant for zero is polymorphic, allowing it to express zero -- Length or Capacitance or Velocity etc, in -- addition to the Dimensionless value zero. _0 :: Num a => Quantity d a _1 :: Num a => Dimensionless a _2 :: Num a => Dimensionless a _3 :: Num a => Dimensionless a _4 :: Num a => Dimensionless a _5 :: Num a => Dimensionless a _6 :: Num a => Dimensionless a _7 :: Num a => Dimensionless a _8 :: Num a => Dimensionless a _9 :: Num a => Dimensionless a pi :: Floating a => Dimensionless a -- | Twice pi. -- -- For background on tau see -- http://tauday.com/tau-manifesto (but also feel free to review -- http://www.thepimanifesto.com). tau :: Floating a => Dimensionless a -- | A polymorphic Unit which can be used in place of the coherent -- SI base unit of any dimension. This allows polymorphic quantity -- creation and destruction without exposing the Dimensional -- constructor. siUnit :: forall d a. (KnownDimension d, Num a) => Unit 'NonMetric d a -- | The unit one has dimension DOne and is the base unit of -- dimensionless values. -- -- As detailed in 7.10 "Values of quantities expressed simply as numbers: -- the unit one, symbol 1" of [1] the unit one generally does not -- appear in expressions. However, for us it is necessary to use -- one as we would any other unit to perform the "boxing" of -- dimensionless values. one :: Num a => Unit 'NonMetric DOne a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is -- irrational or Approximate. See mkUnitQ for when it is -- rational and mkUnitZ for when it is an integer. -- -- Note that supplying zero as a definining quantity is invalid, as the -- library relies upon units forming a group under multiplication. -- -- Supplying negative defining quantities is allowed and handled -- gracefully, but is discouraged on the grounds that it may be -- unexpected by other readers. mkUnitR :: Floating a => UnitName m -> ExactPi -> Unit m1 d a -> Unit m d a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is -- rational. See mkUnitZ for when it is an integer and -- mkUnitR for the general case. -- -- For more information see mkUnitR. mkUnitQ :: Fractional a => UnitName m -> Rational -> Unit m1 d a -> Unit m d a -- | Forms a new atomic Unit by specifying its UnitName and -- its definition as a multiple of another Unit. -- -- Use this variant when the scale factor of the resulting unit is an -- integer. See mkUnitQ for when it is rational and mkUnitR -- for the general case. -- -- For more information see mkUnitR. mkUnitZ :: Num a => UnitName m -> Integer -> Unit m1 d a -> Unit m d a -- | Extracts the UnitName of a Unit. name :: Unit m d a -> UnitName m -- | Extracts the exact value of a Unit, expressed in terms of the -- SI coherent derived unit (see siUnit) of the same -- Dimension. -- -- Note that the actual value may in some cases be approximate, for -- example if the unit is defined by experiment. exactValue :: Unit m d a -> ExactPi -- | Discards potentially unwanted type level information about a -- Unit. weaken :: Unit m d a -> Unit 'NonMetric d a -- | Attempts to convert a Unit which may or may not be -- Metric to one which is certainly Metric. strengthen :: Unit m d a -> Maybe (Unit 'Metric d a) -- | Forms the exact version of a Unit. exactify :: Unit m d a -> Unit m d ExactPi -- | Shows the value of a Quantity expressed in a specified -- Unit of the same Dimension. -- --
-- >>> showIn watt $ (37 *~ volt) * (4 *~ ampere) -- "148.0 W" --showIn :: (Show a, Fractional a) => Unit m d a -> Quantity d a -> String -- | A KnownVariant is one whose term-level Dimensional values we -- can represent with an associated data family instance and manipulate -- with certain functions, not all of which are exported from the -- package. -- -- Each validly constructed type of kind Variant has a -- KnownVariant instance. class KnownVariant (v :: Variant) -- | 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 -- |
-- >>> showIn watt $ (37 *~ volt) * (4 *~ ampere) -- "148.0 W" --showIn :: (Show a, Fractional a) => Unit m d a -> Quantity d a -> String type LuminousIntensity = Quantity DLuminousIntensity type AmountOfSubstance = Quantity DAmountOfSubstance type ThermodynamicTemperature = Quantity DThermodynamicTemperature type ElectricCurrent = Quantity DElectricCurrent type Time = Quantity DTime type Mass = Quantity DMass type Length = Quantity DLength type Dimensionless = Quantity DOne -- | 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 -- | 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 /~ -- | Multiplies two Quantitys or two Units. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NonMetric. (*) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 * v2), Num a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 * v2) (d1 * d2) a infixl 7 * -- | Divides one Quantity by another or one Unit by another. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NotPrefixable. (/) :: (KnownVariant v1, KnownVariant v2, KnownVariant (v1 / v2), Fractional a) => Dimensional v1 d1 a -> Dimensional v2 d2 a -> Dimensional (v1 / v2) (d1 / d2) a infixl 7 / -- | 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 -- | Raises a Quantity or Unit to an integer power. -- -- Because the power chosen impacts the Dimension of the result, -- it is necessary to supply a type-level representation of the exponent -- in the form of a Proxy to some TypeInt. Convenience -- values pos1, pos2, neg1, ... are supplied by -- the Numeric.NumType.DK.Integers module. The most commonly used -- ones are also reexported by Numeric.Units.Dimensional.Prelude. -- -- The intimidating type signature captures the similarity between these -- operations and ensures that composite Units are -- NotPrefixable. (^) :: (Fractional a, KnownTypeInt i, KnownVariant v, KnownVariant (Weaken v)) => Dimensional v d1 a -> Proxy i -> Dimensional (Weaken v) (d1 ^ i) a infixr 8 ^ -- | Negates the value of a Quantity. negate :: Num a => Quantity d a -> Quantity d a -- | Adds two Quantitys. (+) :: Num a => Quantity d a -> Quantity d a -> Quantity d a infixl 6 + -- | Subtracts one Quantity from another. (-) :: Num a => Quantity d a -> Quantity d a -> Quantity d a infixl 6 - -- | Takes the absolute value of a Quantity. abs :: Num a => Quantity d a -> Quantity d a -- | Takes the sign of a Quantity. The functions abs and -- signum satisy the law that: -- --
-- abs x * signum x == x ---- -- The sign is either negate _1 (negative), _0 (zero), -- or _1 (positive). signum :: Num a => Quantity d a -> Dimensionless a -- | 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 -- | 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 ^/ -- | 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 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 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] exp :: Floating a => Dimensionless a -> Dimensionless a log :: Floating 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 -- | 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 -- | 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 -- | The unit one has dimension DOne and is the base unit of -- dimensionless values. -- -- As detailed in 7.10 "Values of quantities expressed simply as numbers: -- the unit one, symbol 1" of [1] the unit one generally does not -- appear in expressions. However, for us it is necessary to use -- one as we would any other unit to perform the "boxing" of -- dimensionless values. one :: Num a => Unit 'NonMetric DOne a -- | The constant for zero is polymorphic, allowing it to express zero -- Length or Capacitance or Velocity etc, in -- addition to the Dimensionless value zero. _0 :: Num a => Quantity d a _1 :: Num a => Dimensionless a _2 :: Num a => Dimensionless a _3 :: Num a => Dimensionless a _4 :: Num a => Dimensionless a _5 :: Num a => Dimensionless a _6 :: Num a => Dimensionless a _7 :: Num a => Dimensionless a _8 :: Num a => Dimensionless a _9 :: Num a => Dimensionless a pi :: Floating a => Dimensionless a -- | Twice pi. -- -- For background on tau see -- http://tauday.com/tau-manifesto (but also feel free to review -- http://www.thepimanifesto.com). tau :: Floating a => Dimensionless a -- | 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) -- | 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 pos5 :: Proxy Pos5 pos4 :: Proxy Pos4 pos3 :: Proxy Pos3 pos2 :: Proxy Pos2 pos1 :: Proxy Pos1 zero :: Proxy Zero neg1 :: Proxy Neg1 neg2 :: Proxy Neg2 neg3 :: Proxy Neg3 neg4 :: Proxy Neg4 neg5 :: Proxy Neg5 -- | A class for categories. Instances should satisfy the laws -- --
-- f . id = f -- (right identity) -- id . f = f -- (left identity) -- f . (g . h) = (f . g) . h -- (associativity) --class Category (cat :: k -> k -> Type) -- | the identity morphism id :: Category cat => cat a a -- | morphism composition (.) :: Category cat => cat b c -> cat a b -> cat a c infixr 9 . -- | The largest element of a non-empty structure. maximum :: (Foldable t, Ord a) => t a -> a -- | The least element of a non-empty structure. minimum :: (Foldable t, Ord a) => t 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. (++) :: () => [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 :: () => a -> b -> b -- | 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 :: () => (a -> Bool) -> [a] -> [a] -- | 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 short, excess elements of the longer list are -- discarded: -- --
-- zip [1] ['a', 'b'] = [(1, 'a')] -- zip [1, 2] ['a'] = [(1, 'a')] ---- -- zip is right-lazy: -- --
-- zip [] _|_ = [] -- zip _|_ [] = _|_ --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 () -- | Extract the first component of a pair. fst :: () => (a, b) -> a -- | Extract the second component of a pair. snd :: () => (a, b) -> b -- | otherwise is defined as the value True. It helps to make -- guards more readable. eg. -- --
-- f x | x < 0 = ... -- | otherwise = ... --otherwise :: Bool -- | 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 :: () => (a -> b) -> [a] -> [b] -- | 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 levity-polymorphic in its result type, so -- that foo $ True where foo :: Bool -> Int# is well-typed ($) :: () => (a -> b) -> a -> b infixr 0 $ -- | general coercion from integral types fromIntegral :: (Integral a, Num b) => a -> b -- | general coercion to fractional types realToFrac :: (Real a, Fractional b) => a -> b -- | 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] = []
-- (x `quot` y)*y + (x `rem` y) == x --rem :: Integral a => a -> a -> a -- | integer division truncated toward negative infinity div :: Integral a => a -> a -> a -- | integer modulus, satisfying -- --
-- (x `div` y)*y + (x `mod` y) == x --mod :: Integral a => a -> a -> a -- | simultaneous quot and rem quotRem :: Integral a => a -> a -> (a, a) -- | simultaneous div and mod 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` -- | The Monad class defines the basic operations over a -- monad, a concept from a branch of mathematics known as -- category theory. From the perspective of a Haskell programmer, -- however, it is best to think of a monad as an abstract datatype -- of actions. Haskell's do expressions provide a convenient -- syntax for writing monadic expressions. -- -- Instances of Monad should satisfy the following laws: -- -- -- -- Furthermore, the Monad and Applicative operations should -- relate as follows: -- -- -- -- The above laws imply: -- -- -- -- and that pure and (<*>) satisfy the applicative -- functor laws. -- -- The instances of Monad for lists, Maybe and IO -- defined in the Prelude satisfy these laws. class Applicative m => Monad (m :: Type -> Type) -- | Sequentially compose two actions, passing any value produced by the -- first as an argument to the second. (>>=) :: 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. (>>) :: Monad m => m a -> m b -> m b -- | Inject a value into the monadic type. return :: Monad m => a -> m a -- | Fail with a message. This operation is not part of the mathematical -- definition of a monad, but is invoked on pattern-match failure in a -- do expression. -- -- As part of the MonadFail proposal (MFP), this function is moved to its -- own class MonadFail (see Control.Monad.Fail for more -- details). The definition here will be removed in a future release. fail :: Monad m => String -> m a infixl 1 >>= infixl 1 >> -- | The Functor class is used for types that can be mapped over. -- Instances of Functor should satisfy the following laws: -- --
-- fmap id == id -- fmap (f . g) == fmap f . fmap g ---- -- The instances of Functor for lists, Maybe and IO -- satisfy these laws. class Functor (f :: Type -> Type) 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. (<$) :: 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: -- --
-- 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] class (Num a, Ord a) => Real a -- | the rational equivalent of its real argument with full precision toRational :: Real a => a -> Rational -- | Efficient, machine-independent access to the components of a -- floating-point number. class (RealFrac a, Floating a) => RealFloat a -- | a constant function, returning the radix of the representation (often -- 2) floatRadix :: RealFloat a => a -> Integer -- | a constant function, returning the number of digits of -- floatRadix in the significand floatDigits :: RealFloat a => a -> Int -- | a constant function, returning the lowest and highest values the -- exponent may assume floatRange :: RealFloat a => a -> (Int, Int) -- | The function decodeFloat applied to a real floating-point -- number returns the significand expressed as an Integer and an -- appropriately scaled exponent (an Int). If -- decodeFloat x yields (m,n), then x -- is equal in value to m*b^^n, where b is the -- floating-point radix, and furthermore, either m and -- n are both zero or else b^(d-1) <= abs m < -- b^d, where d is the value of floatDigits -- x. In particular, decodeFloat 0 = (0,0). If the -- type contains a negative zero, also decodeFloat (-0.0) = -- (0,0). The result of decodeFloat x is -- unspecified if either of isNaN x or -- isInfinite x is True. decodeFloat :: RealFloat a => a -> (Integer, Int) -- | encodeFloat performs the inverse of decodeFloat in the -- sense that for finite x with the exception of -0.0, -- uncurry encodeFloat (decodeFloat x) = -- x. encodeFloat m n is one of the two closest -- representable floating-point numbers to m*b^^n (or -- ±Infinity if overflow occurs); usually the closer, but if -- m contains too many bits, the result may be rounded in the -- wrong direction. encodeFloat :: RealFloat a => Integer -> Int -> a -- | exponent corresponds to the second component of -- decodeFloat. exponent 0 = 0 and for finite -- nonzero x, exponent x = snd (decodeFloat x) -- + floatDigits x. If x is a finite floating-point -- number, it is equal in value to significand x * b ^^ -- exponent x, where b is the floating-point radix. -- The behaviour is unspecified on infinite or NaN values. exponent :: RealFloat a => a -> Int -- | The first component of decodeFloat, scaled to lie in the open -- interval (-1,1), either 0.0 or of absolute -- value >= 1/b, where b is the floating-point -- radix. The behaviour is unspecified on infinite or NaN -- values. significand :: RealFloat a => a -> a -- | multiplies a floating-point number by an integer power of the radix scaleFloat :: RealFloat a => Int -> a -> a -- | True if the argument is an IEEE "not-a-number" (NaN) value isNaN :: RealFloat a => a -> Bool -- | True if the argument is an IEEE infinity or negative infinity isInfinite :: RealFloat a => a -> Bool -- | True if the argument is too small to be represented in -- normalized format isDenormalized :: RealFloat a => a -> Bool -- | True if the argument is an IEEE negative zero isNegativeZero :: RealFloat a => a -> Bool -- | True if the argument is an IEEE floating point number isIEEE :: RealFloat a => a -> Bool -- | Extracting components of fractions. class (Real a, Fractional a) => RealFrac a -- | The function properFraction takes a real fractional number -- x and returns a pair (n,f) such that x = -- n+f, and: -- --
-- 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 -- | 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. (<*>) :: Applicative f => f (a -> b) -> f a -> f b -- | Sequence actions, discarding the value of the first argument. (*>) :: 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 <* -- | Data structures that can be folded. -- -- For example, given a data type -- --
-- data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a) ---- -- a suitable instance would be -- --
-- instance Foldable Tree where -- foldMap f Empty = mempty -- foldMap f (Leaf x) = f x -- foldMap f (Node l k r) = foldMap f l `mappend` f k `mappend` foldMap f r ---- -- This is suitable even for abstract types, as the monoid is assumed to -- satisfy the monoid laws. Alternatively, one could define -- foldr: -- --
-- instance Foldable Tree where -- foldr f z Empty = z -- foldr f z (Leaf x) = f x z -- foldr f z (Node l k r) = foldr f (f k (foldr f z r)) l ---- -- Foldable instances are expected to satisfy the following -- laws: -- --
-- foldr f z t = appEndo (foldMap (Endo . f) t ) z ---- --
-- foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z ---- --
-- fold = foldMap id ---- --
-- length = getSum . foldMap (Sum . const 1) ---- -- sum, product, maximum, and minimum -- should all be essentially equivalent to foldMap forms, such -- as -- --
-- sum = getSum . foldMap Sum ---- -- but may be less defined. -- -- If the type is also a Functor instance, it should satisfy -- --
-- foldMap f = fold . fmap f ---- -- which implies that -- --
-- foldMap f . fmap g = foldMap (f . g) --class Foldable (t :: Type -> Type) -- | Map each element of the structure to a monoid, and combine the -- results. foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m -- | Right-associative fold of a structure. -- -- 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, -- foldr can produce a terminating expression from an infinite -- list. -- -- For a general Foldable structure this should be semantically -- identical to, -- --
-- foldr f z = foldr f z . toList --foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b -- | Left-associative fold of a structure. -- -- 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. This means that foldl' -- will diverge if given an infinite list. -- -- Also note that if you want an efficient left-fold, you probably want -- to use foldl' instead of foldl. The reason for this is -- that 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 :: 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. -- --
-- foldr1 f = foldr1 f . toList --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. -- --
-- foldl1 f = foldl1 f . toList --foldl1 :: Foldable t => (a -> a -> a) -> t a -> a -- | Test whether the structure is empty. The default implementation is -- optimized for structures that are similar to cons-lists, because there -- is no general way to do better. null :: Foldable t => t a -> Bool -- | Returns the size/length of a finite structure as an Int. The -- default implementation is optimized for structures that are similar to -- cons-lists, because there is no general way to do better. length :: Foldable t => t a -> Int -- | Does the element occur in the structure? elem :: (Foldable t, Eq a) => a -> t a -> Bool infix 4 `elem` -- | Functors representing data structures that can be traversed from left -- to right. -- -- A definition of traverse must satisfy the following laws: -- --
-- t :: (Applicative f, Applicative g) => f a -> g a ---- -- preserving the Applicative operations, i.e. -- -- -- -- and the identity functor Identity and composition of functors -- Compose are defined as -- --
-- newtype Identity a = Identity a -- -- instance Functor Identity where -- fmap f (Identity x) = Identity (f x) -- -- instance Applicative Identity where -- pure x = Identity x -- Identity f <*> Identity x = Identity (f x) -- -- newtype Compose f g a = Compose (f (g a)) -- -- instance (Functor f, Functor g) => Functor (Compose f g) where -- fmap f (Compose x) = Compose (fmap (fmap f) x) -- -- instance (Applicative f, Applicative g) => Applicative (Compose f g) where -- pure x = Compose (pure (pure x)) -- Compose f <*> Compose x = Compose ((<*>) <$> f <*> x) ---- -- (The naturality law is implied by parametricity.) -- -- Instances are similar to Functor, e.g. given a data type -- --
-- data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a) ---- -- a suitable instance would be -- --
-- instance Traversable Tree where -- traverse f Empty = pure Empty -- traverse f (Leaf x) = Leaf <$> f x -- traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r ---- -- This is suitable even for abstract types, as the laws for -- <*> imply a form of associativity. -- -- The superclass instances should satisfy the following: -- --
x <> mempty = x
mempty <> x = x
mconcat = foldr '(<>)' -- mempty
-- >>> 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 -- | 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 -- | The readLn function combines getLine and readIO. readLn :: Read a => IO a -- | 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 computation writeFile file str function writes the -- string str, to the file file. writeFile :: FilePath -> 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 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 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 -- | Read a line from the standard input device (same as hGetLine -- stdin). getLine :: IO String -- | Read a character from the standard input device (same as -- hGetChar stdin). getChar :: IO Char -- | The same as putStr, but adds a newline character. putStrLn :: String -> IO () -- | Write a string to the standard output device (same as hPutStr -- stdout). putStr :: String -> IO () -- | Write a character to the standard output device (same as -- hPutChar stdout). putChar :: Char -> IO () -- | Raise an IOException in the IO monad. ioError :: () => IOError -> IO a -- | 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 -- | 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 -- | 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 -- | notElem is the negation of elem. notElem :: (Foldable t, Eq a) => a -> t a -> Bool infix 4 `notElem` -- | Determines whether all elements of the structure satisfy the -- predicate. all :: Foldable t => (a -> Bool) -> t a -> Bool -- | Determines whether any element of the structure satisfies the -- predicate. any :: Foldable t => (a -> Bool) -> t a -> 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 :: Foldable t => t Bool -> Bool -- | 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 :: Foldable t => t Bool -> Bool -- | Map a function over all the elements of a container and concatenate -- the resulting lists. concatMap :: Foldable t => (a -> [b]) -> t a -> [b] -- | The concatenation of all the elements of a container of lists. concat :: Foldable t => t [a] -> [a] -- | 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. -- -- As of base 4.8.0.0, sequence_ is just sequenceA_, -- specialized to Monad. sequence_ :: (Foldable t, Monad m) => t (m a) -> m () -- | 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. -- -- As of base 4.8.0.0, mapM_ is just traverse_, specialized -- to Monad. mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m () -- | unwords is an inverse operation to words. It joins words -- with separating spaces. -- --
-- >>> unwords ["Lorem", "ipsum", "dolor"] -- "Lorem ipsum dolor" --unwords :: [String] -> String -- | words breaks a string up into a list of words, which were -- delimited by white space. -- --
-- >>> words "Lorem ipsum\ndolor" -- ["Lorem","ipsum","dolor"] --words :: String -> [String] -- | unlines is an inverse operation to lines. It joins -- lines, after appending a terminating newline to each. -- --
-- >>> unlines ["Hello", "World", "!"] -- "Hello\nWorld\n!\n" --unlines :: [String] -> String -- | lines breaks a string up into a list of strings at newline -- characters. The resulting strings do not contain newlines. -- -- Note that after splitting the string at newline characters, the last -- part of the string is considered a line even if it doesn't end with a -- newline. For example, -- --
-- >>> lines "" -- [] ---- --
-- >>> lines "\n" -- [""] ---- --
-- >>> lines "one" -- ["one"] ---- --
-- >>> lines "one\n" -- ["one"] ---- --
-- >>> lines "one\n\n" -- ["one",""] ---- --
-- >>> lines "one\ntwo" -- ["one","two"] ---- --
-- >>> lines "one\ntwo\n" -- ["one","two"] ---- -- Thus lines s contains at least as many elements as -- newlines in s. lines :: String -> [String] -- | 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 -- | equivalent to readsPrec with a precedence of 0. reads :: Read a => ReadS a -- | Case analysis for the Either type. If the value is -- Left a, apply the first function to a; if it -- is Right b, apply the second function to b. -- --
-- >>> 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 -- | 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: -- --
-- ($) :: (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 <$> -- | lcm x y is the smallest positive integer that both -- x and y divide. lcm :: Integral a => a -> a -> a -- | 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 -- | raise a number to an integral power (^^) :: (Fractional a, Integral b) => a -> b -> a infixr 8 ^^ odd :: Integral a => a -> Bool even :: Integral a => a -> Bool -- | utility function that surrounds the inner show function with -- parentheses when the Bool parameter is True. showParen :: Bool -> ShowS -> ShowS -- | utility function converting a String to a show function that -- simply prepends the string unchanged. showString :: String -> ShowS -- | utility function converting a Char to a show function that -- simply prepends the character unchanged. showChar :: Char -> ShowS -- | equivalent to showsPrec with a precedence of 0. shows :: Show a => a -> ShowS -- | 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 -- | The unzip3 function takes a list of triples and returns three -- lists, analogous to unzip. unzip3 :: () => [(a, b, c)] -> ([a], [b], [c]) -- | unzip transforms a list of pairs into a list of first -- components and a list of second components. unzip :: () => [(a, b)] -> ([a], [b]) -- | The zipWith3 function takes a function which combines three -- elements, as well as three lists and returns a list of their -- point-wise combination, analogous to zipWith. zipWith3 :: () => (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] -- | zipWith generalises zip by zipping with the function -- given as the first argument, instead of a tupling function. For -- example, zipWith (+) is applied to two lists to -- produce the list of corresponding sums. -- -- zipWith is right-lazy: -- --
-- zipWith f [] _|_ = [] --zipWith :: () => (a -> b -> c) -> [a] -> [b] -> [c] -- | zip3 takes three lists and returns a list of triples, analogous -- to zip. zip3 :: () => [a] -> [b] -> [c] -> [(a, b, c)] -- | 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] -> Int -> a infixl 9 !! -- | lookup key assocs looks up a key in an association -- list. lookup :: Eq a => a -> [(a, b)] -> Maybe b -- | reverse xs returns the elements of xs in -- reverse order. xs must be finite. reverse :: () => [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]) -- | 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]) -- | 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])
-- | 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] -- | 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] -- | 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] -- | 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] -- | 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 :: () => [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 :: () => Int -> a -> [a] -- | repeat x is an infinite list, with x the -- value of every element. repeat :: () => 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. iterate :: () => (a -> a) -> a -> [a] -- | scanr1 is a variant of scanr that has no starting value -- argument. scanr1 :: () => (a -> a -> a) -> [a] -> [a] -- | scanr is the right-to-left dual of scanl. Note that -- --
-- head (scanr f z xs) == foldr f z xs. --scanr :: () => (a -> b -> b) -> b -> [a] -> [b] -- | scanl1 is a variant of scanl that has no starting value -- argument: -- --
-- scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...] --scanl1 :: () => (a -> a -> a) -> [a] -> [a] -- | 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 :: () => (b -> a -> b) -> b -> [a] -> [b] -- | Return all the elements of a list except the last one. The list must -- be non-empty. init :: () => [a] -> [a] -- | Extract the last element of a list, which must be finite and -- non-empty. last :: () => [a] -> a -- | Extract the elements after the head of a list, which must be -- non-empty. tail :: () => [a] -> [a] -- | Extract the first element of a list, which must be non-empty. head :: () => [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 -- | 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 -- | curry converts an uncurried function to a curried function. -- --
-- >>> curry fst 1 2 -- 1 --curry :: () => ((a, b) -> c) -> a -> b -> c -- | 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 -- | 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 -- | until p f yields the result of applying f -- until p holds. until :: () => (a -> Bool) -> (a -> a) -> a -> a -- | 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. ($!) :: () => (a -> b) -> a -> b infixr 0 $! -- | flip f takes its (first) two arguments in the reverse -- order of f. -- --
-- >>> flip (++) "hello" "world" -- "worldhello" --flip :: () => (a -> b -> c) -> b -> a -> c -- | const x is a unary function which evaluates to x for -- all inputs. -- --
-- >>> const 42 "hello" -- 42 ---- --
-- >>> map (const 42) [0..3] -- [42,42,42,42] --const :: () => a -> b -> a -- | Same as >>=, but with the arguments interchanged. (=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 =<< -- | A String is a list of characters. String constants in Haskell -- are values of type String. type String = [Char] -- | 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 :: HasCallStack => a -- | A variant of error that does not produce a stack trace. errorWithoutStackTrace :: () => [Char] -> a -- | error stops execution and displays an error message. error :: HasCallStack => [Char] -> a -- | Boolean "and" (&&) :: Bool -> Bool -> Bool infixr 3 && -- | Boolean "or" (||) :: Bool -> Bool -> Bool infixr 2 || -- | Boolean "not" not :: Bool -> Bool -- |
-- >>> 1 *~ gee -- 9.80665 m s^-2 ---- --
-- >>> 1 *~ gee :: Acceleration Rational -- 196133 % 20000 m s^-2 --gee :: Fractional a => Unit 'Metric DAcceleration a -- | One avoirdupois pound is a mass, exactly defined in terms of the -- kilogram by the international yard and pound agreement of 1959. -- -- See here for further information. -- --
-- >>> 1 *~ poundMass -- 0.45359237 kg ---- --
-- >>> 1 *~ poundMass :: Mass Rational -- 45359237 % 100000000 kg --poundMass :: Fractional a => Unit 'NonMetric DMass a -- | One avoirdupois ounce is one sixteenth of a poundMass. -- -- See here for further information. -- --
-- >>> 1 *~ ounce -- 2.8349523125e-2 kg ---- --
-- 16 *~ ounce === 1 *~ poundMass ---- --
-- >>> 1 *~ ounce :: Mass Rational -- 45359237 % 1600000000 kg --ounce :: Fractional a => Unit 'NonMetric DMass a -- | The pound-force is equal to the gravitational force exerted on a mass -- of one avoirdupois pound on the surface of Earth. -- -- This definition is based on standard gravity (the gee) and the -- international avoirdupois poundMass. -- -- See here for further information. -- --
-- >>> 1 *~ poundForce -- 4.4482216152605 m kg s^-2 ---- --
-- 1 *~ poundForce === 1 *~ poundMass * (1 *~ gee) ---- --
-- >>> 1 *~ poundForce :: Force Rational -- 8896443230521 % 2000000000000 m kg s^-2 --poundForce :: Fractional a => Unit 'NonMetric DForce a -- | One mechanical horsepower is by definition the power necessary to -- apply a force of 550 poundForce through a distance of one -- foot per second. -- -- See here for further information. -- --
-- >>> 1 *~ horsepower -- 745.6998715822702 m^2 kg s^-3 ---- --
-- 1 *~ horsepower === 550 *~ poundForce * (1 *~ foot) / (1 *~ second) ---- --
-- >>> 1 *~ horsepower :: Power Rational -- 37284993579113511 % 50000000000000 m^2 kg s^-3 --horsepower :: Fractional a => Unit 'NonMetric DPower a -- | One btu is is the QuantityOfHeat required to raise the -- temperature of 1 avoirdupois poundMass of liquid water by 1 -- degreeFahrenheit at a constant pressure of one -- atmosphere. -- -- Because this value must be determined experimentally and varies with -- temperature, several standardized values of the btu have arisen. This -- is the value based on the International Steam Table calorie, defined -- by the Fifth International Conference on the Properties of Steam. -- -- See here for further information. -- --
-- >>> 1 *~ btu -- 1055.05585262 m^2 kg s^-2 ---- --
-- >>> 1 *~ btu :: Energy Rational -- 52752792631 % 50000000 m^2 kg s^-2 --btu :: Fractional a => Unit 'NonMetric DEnergy a -- | One short ton is two thousand poundMass. -- -- See here for further information. -- --
-- >>> 1 *~ shortTon -- 907.18474 kg ---- --
-- >>> 1 *~ shortTon :: Mass Rational -- 45359237 % 50000 kg --shortTon :: Fractional a => Unit 'NonMetric DMass a -- | One nautical mile is a unit of length, set by international agreement -- as being exactly 1 852 meters. -- -- Historically, it was defined as the distance spanned by one minute of -- arc along a meridian of the Earth. -- -- See here for further information. -- --
-- >>> 1 *~ nauticalMile -- 1852.0 m ---- --
-- >>> 1 *~ nauticalMile :: Length Rational -- 1852 % 1 m --nauticalMile :: Num a => Unit 'NonMetric DLength a -- | One knot is a velocity equal to one nauticalMile per -- hour. -- -- See here for further information. -- --
-- >>> 1 *~ knot -- 0.5144444444444445 m s^-1 ---- --
-- >>> 1 *~ knot :: Velocity Rational -- 463 % 900 m s^-1 --knot :: Fractional a => Unit 'NonMetric DVelocity a -- | One revolution is an angle equal to 2 pi radians; a full circle. -- -- See here for further information. -- --
-- >>> 1 *~ revolution -- 6.283185307179586 ---- --
-- 1 *~ revolution === _2 * pi * (1 *~ radian) ---- --
-- 1 *~ revolution === 360 *~ degree --revolution :: Floating a => Unit 'NonMetric DOne a solid :: Floating a => Unit 'NonMetric DOne a -- | The slug is a unit of mass associated with Imperial units and United -- States customary units. It is a mass that accelerates by 1 foot per -- second per second when a force of one pound is exerted on it. -- -- This definition is based on standard gravity (the gee), the -- international foot, and the international avoirdupois -- poundMass. -- -- See here for further information. -- --
-- >>> 1 *~ slug -- 14.593902937206364 kg ---- --
-- >>> 1 *~ slug :: Mass Rational -- 8896443230521 % 609600000000 kg --slug :: Fractional a => Unit 'NonMetric DMass a -- | One psi is a pressure of one poundForce per square -- inch of area. -- -- See here for further information. -- --
-- >>> 1 *~ psi -- 6894.757293168362 m^-1 kg s^-2 ---- --
-- >>> 1 *~ psi :: Pressure Rational -- 8896443230521 % 1290320000 m^-1 kg s^-2 --psi :: Fractional a => Unit 'NonMetric DPressure a teaspoon :: Fractional a => Unit 'NonMetric DVolume a -- | One international foot is one third of an international yard. -- -- See here for further information. -- --
-- >>> 1 *~ foot -- 0.3048 m ---- --
-- 3 *~ foot === 1 *~ yard ---- --
-- >>> 1 *~ foot :: Length Rational -- 381 % 1250 m --foot :: Fractional a => Unit 'NonMetric DLength a -- | One inch is one twelth of a foot. -- -- This inch is based on the international foot. -- -- See here for further information. -- --
-- >>> 1 *~ inch -- 2.54e-2 m ---- --
-- 12 *~ inch === 1 *~ foot ---- --
-- >>> 1 *~ inch :: Length Rational -- 127 % 5000 m --inch :: Fractional a => Unit 'NonMetric DLength a -- | One mil is one thousandth of an inch. -- -- This mil is based on the international inch. -- -- See here for further information. -- --
-- >>> 1 *~ mil -- 2.54e-5 m ---- --
-- 1000 *~ mil === 1 *~ inch ---- --
-- >>> 1 *~ mil :: Length Rational -- 127 % 5000000 m --mil :: Fractional a => Unit 'NonMetric DLength a -- | One yard, as defined by international agreement in 1959, is precisely -- 0.9144 meter. -- -- See here for further information. -- --
-- >>> 1 *~ yard -- 0.9144 m ---- --
-- >>> 1 *~ yard :: Length Rational -- 1143 % 1250 m --yard :: Fractional a => Unit 'NonMetric DLength a -- | One mile is 5 280 feet. -- -- This mile is based on the international foot. -- -- See here for further information. -- --
-- >>> 1 *~ mile -- 1609.344 m ---- --
-- 1 *~ mile === 5280 *~ foot ---- --
-- >>> 1 *~ mile :: Length Rational -- 201168 % 125 m --mile :: Fractional a => Unit 'NonMetric DLength a -- | One acre is 43 560 square feet. -- -- This acre is based on the international foot. For the acre -- based on the US Survey Foot, see usSurveyAcre. While both acres -- are in use, the difference between them is of little consequence for -- most applications in which either is used. -- -- See here for further information. -- --
-- >>> 1 *~ acre -- 4046.8564224 m^2 ---- --
-- 1 *~ acre === 43560 *~ foot ^ pos2 ---- --
-- >>> 1 *~ acre :: Area Rational -- 316160658 % 78125 m^2 --acre :: Fractional a => Unit 'NonMetric DArea a -- | One US survey foot is 1200/3937 meter. -- -- For the international foot, see foot. Note that this is not the -- foot in routine use in the United States. -- -- See here for further information. -- --
-- >>> 1 *~ usSurveyFoot -- 0.3048006096012192 m ---- --
-- >>> 1 *~ usSurveyFoot :: Length Rational -- 1200 % 3937 m --usSurveyFoot :: Fractional a => Unit 'NonMetric DLength a -- | One inch is one twelth of a foot. -- -- This inch is based on the usSurveyFoot. For the inch based on -- the international foot, see inch. Note that this is not the -- inch in routine use in the United States. -- -- See here for further information. -- --
-- >>> 1 *~ usSurveyInch -- 2.54000508001016e-2 m ---- --
-- 12 *~ usSurveyInch === 1 *~ usSurveyFoot ---- --
-- >>> 1 *~ usSurveyInch :: Length Rational -- 100 % 3937 m --usSurveyInch :: Fractional a => Unit 'NonMetric DLength a -- | One mil is one thousandth of an inch. -- -- This mil is based on the usSurveyInch. For the mil based on the -- international inch, see mil. Note that this is not the mil in -- routine use in the United States. -- -- See here for further information. -- --
-- >>> 1 *~ usSurveyMil -- 2.54000508001016e-5 m ---- --
-- 1000 *~ usSurveyMil === 1 *~ usSurveyInch ---- --
-- >>> 1 *~ usSurveyMil :: Length Rational -- 1 % 39370 m --usSurveyMil :: Fractional a => Unit 'NonMetric DLength a -- | One yard is three feet. -- -- This yard is based on the usSurveyFoot. For the international -- yard, see yard. Note that this is not the yard in routine use -- in the United States. -- -- See here for further information. -- --
-- >>> 1 *~ usSurveyYard -- 0.9144018288036576 m ---- --
-- 1 *~ usSurveyYard === 3 *~ usSurveyFoot ---- --
-- >>> 1 *~ usSurveyYard :: Length Rational -- 3600 % 3937 m --usSurveyYard :: Fractional a => Unit 'NonMetric DLength a -- | One US survey mile is 5 280 US survey feet. -- -- This mile is based on the usSurveyFoot. For the mile based on -- the international foot, see mile. Note that this is not the -- mile in routine use in the United States. -- -- See here for further information. -- --
-- >>> 1 *~ usSurveyMile -- 1609.3472186944373 m ---- --
-- 1 *~ usSurveyMile === 5280 *~ usSurveyFoot ---- --
-- >>> 1 *~ usSurveyMile :: Length Rational -- 6336000 % 3937 m --usSurveyMile :: Fractional a => Unit 'NonMetric DLength a -- | One acre is 43 560 square feet. -- -- This acre is based on the usSurveyFoot. For the acre based on -- the international foot, see acre. While both acres are in use, -- the difference between them is of little consequence for most -- applications in which either is used. This is the only acre defined by -- the UCUM. -- -- See here for further information. -- --
-- >>> 1 *~ usSurveyAcre -- 4046.872609874252 m^2 ---- --
-- 1 *~ usSurveyAcre === 43560 *~ usSurveyFoot ^ pos2 ---- --
-- >>> 1 *~ usSurveyAcre :: Area Rational -- 62726400000 % 15499969 m^2 --usSurveyAcre :: Fractional a => Unit 'NonMetric DArea a -- | One mean Julian year is a unit of measurement of time defined as -- exactly 365.25 days of 86 400 seconds each. -- -- See here for further information. -- --
-- >>> 1 *~ year -- 3.15576e7 s ---- --
-- >>> 1 *~ year :: Time Rational -- 31557600 % 1 s --year :: Num a => Unit 'NonMetric DTime a -- | One mean Julian century is one hundred mean Julian years. -- --
-- >>> 1 *~ century -- 3.15576e9 s ---- --
-- >>> 1 *~ century :: Time Rational -- 3155760000 % 1 s --century :: Num a => Unit 'NonMetric DTime a -- | The bar is exactly 100 000 pascal. -- -- From Wikipedia: -- -- It is about equal to the atmospheric pressure on Earth at sea level. -- --
-- >>> 1 *~ bar -- 100000.0 m^-1 kg s^-2 ---- --
-- >>> 1 *~ bar :: Pressure Rational -- 100000 % 1 m^-1 kg s^-2 --bar :: Num a => Unit 'Metric DPressure a -- | The "standard atmosphere". -- -- From Wikipedia [3]: -- -- The standard atmosphere (atm) is an established constant. It is -- approximately equal to typical air pressure at earth mean sea level. -- --
-- >>> 1 *~ atmosphere -- 101325.0 m^-1 kg s^-2 ---- --
-- >>> 1 *~ atmosphere :: Pressure Rational -- 101325 % 1 m^-1 kg s^-2 --atmosphere :: Num a => Unit 'NonMetric DPressure a -- | The "technical atmosphere" -- -- From Wikipedia: -- -- A technical atmosphere (symbol: at) is a non-SI unit of pressure equal -- to one kilogram-force per square centimeter. -- --
-- >>> 1 *~ technicalAtmosphere -- 98066.5 m^-1 kg s^-2 ---- --
-- >>> 1 *~ technicalAtmosphere :: Pressure Rational -- 196133 % 2 m^-1 kg s^-2 --technicalAtmosphere :: Fractional a => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 mm high column -- of mercury. -- -- Per Wikipedia [4], one mmHg (millimeter of mercury) is defined -- as: -- -- The pressure exerted at the base of a column of fluid exactly 1 mm -- high, when the density of the fluid is exactly 13.5951 g/cm^3, at a -- place where the acceleration of gravity is exactly 9.80665 m/s^2. -- -- The chosen fluid density approximately corresponds to that of mercury -- at 0 deg. Under most conditions, 1 mmHg is approximately equal to 1 -- torr. -- --
-- >>> 1 *~ mmHg -- 133.322 m^-1 kg s^-2 ---- --
-- >>> 1 *~ mmHg :: Pressure Rational -- 66661 % 500 m^-1 kg s^-2 --mmHg :: Fractional a => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 inch high -- column of mercury. -- -- Column inches of mercury are also used to measure pressure, especially -- in meteorological or aeronautical contexts in the United States. -- -- This is the value defined by UCUM. For the value defined by NIST, see -- inHg_NIST. -- --
-- >>> 1 *~ inHg -- 3386.3788 m^-1 kg s^-2 ---- --
-- >>> 1 *~ inHg :: Pressure Rational -- 8465947 % 2500 m^-1 kg s^-2 --inHg :: Fractional a => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 inch high -- column of mercury. -- -- Column inches of mercury are also used to measure pressure, especially -- in meteorological or aeronautical contexts in the United States. -- -- This is the value defined by UCUM. For the value defined by NIST, see -- inHg_NIST. -- --
-- >>> 1 *~ inHg_UCUM -- 3386.3788 m^-1 kg s^-2 ---- --
-- >>> 1 *~ inHg_UCUM :: Pressure Rational -- 8465947 % 2500 m^-1 kg s^-2 --inHg_UCUM :: Fractional a => Unit 'NonMetric DPressure a -- | The conventional value for the pressure exerted by a 1 inch high -- column of mercury. -- -- Column inches of mercury are also used to measure pressure, especially -- in meteorological or aeronautical contexts in the United States. -- -- This is the value defined by NIST. For the value defined by UCUM, see -- inHg_UCUM. -- --
-- >>> 1 *~ inHg_NIST -- 3386.389 m^-1 kg s^-2 ---- --
-- >>> 1 *~ inHg_NIST :: Pressure Rational -- 3386389 % 1000 m^-1 kg s^-2 --inHg_NIST :: Fractional a => Unit 'NonMetric DPressure a -- | One torr (symbol: Torr) is defined as 1/760 atmosphere, which -- is approximately equal to 1 mmHg. -- -- See here for further information. -- --
-- >>> 1 *~ torr -- 133.32236842105263 m^-1 kg s^-2 ---- --
-- >>> 1 *~ torr :: Pressure Rational -- 20265 % 152 m^-1 kg s^-2 --torr :: Fractional a => Unit 'NonMetric DPressure a -- | The rad is a deprecated unit of AbsorbedDose, defined as 0.01 -- gray. -- -- See here for further information. -- --
-- >>> 1 *~ rad -- 1.0e-2 m^2 s^-2 ---- --
-- >>> 1 *~ rad :: AbsorbedDose Rational -- 1 % 100 m^2 s^-2 --rad :: Fractional a => Unit 'Metric DAbsorbedDose a -- | One Stokes is a unit of KinematicViscosity equal to 1 cm^2 -- / s. -- -- See here for further information. -- --
-- >>> 1 *~ stokes -- 1.0e-4 m^2 s^-1 ---- --
-- >>> 1 *~ stokes :: KinematicViscosity Rational -- 1 % 10000 m^2 s^-1 --stokes :: Fractional a => Unit 'Metric DKinematicViscosity a -- | One degree Fahrenheit is a unit of relative temperature equal to 5/9 -- kelvin. -- -- Note that although the Fahrenheit scale is an absolute temperature -- scale, this unit is a unit of difference within that scale and -- measures relative temperature. -- -- See here for further information. -- --
-- >>> 1 *~ degreeFahrenheit -- 0.5555555555555556 K ---- --
-- >>> 1 *~ degreeFahrenheit :: ThermodynamicTemperature Rational -- 5 % 9 K --degreeFahrenheit :: Fractional a => Unit 'NonMetric DThermodynamicTemperature a -- | One degree Rankine is a unit of relative temperature equal to 5/9 -- kelvin. -- -- Note that although the Rankine scale is an absolute temperature scale, -- this unit is a unit of difference within that scale and measures -- relative temperature. -- -- See here for further information. -- --
-- >>> 1 *~ degreeRankine -- 0.5555555555555556 K ---- --
-- >>> 1 *~ degreeRankine :: ThermodynamicTemperature Rational -- 5 % 9 K --degreeRankine :: Fractional a => Unit 'NonMetric DThermodynamicTemperature a -- | One imperial gallon is defined exactly in terms of the liter by -- the Weights and Measures Act 1985. -- -- See here for further information. -- --
-- >>> 1 *~ imperialGallon -- 4.54609e-3 m^3 ---- --
-- >>> 1 *~ imperialGallon :: Volume Rational -- 454609 % 100000000 m^3 --imperialGallon :: Fractional a => Unit 'NonMetric DVolume a -- | One imperial quart is one quarter of an imperialGallon. -- -- See here for further information. -- --
-- >>> 1 *~ imperialQuart -- 1.1365225e-3 m^3 ---- --
-- >>> 1 *~ imperialQuart :: Volume Rational -- 454609 % 400000000 m^3 --imperialQuart :: Fractional a => Unit 'NonMetric DVolume a -- | One imperial pint is one half of an imperialQuart. -- -- See here for further information. -- --
-- >>> 1 *~ imperialPint -- 5.6826125e-4 m^3 ---- --
-- >>> 1 *~ imperialPint :: Volume Rational -- 454609 % 800000000 m^3 --imperialPint :: Fractional a => Unit 'NonMetric DVolume a -- | One imperial cup is one half of an imperialPint. -- -- This unit is not in common use and is does not appear in some sources -- describing the imperial fluid volume units. -- -- See here for further information. -- --
-- >>> 1 *~ imperialCup -- 2.84130625e-4 m^3 ---- --
-- >>> 1 *~ imperialCup :: Volume Rational -- 454609 % 1600000000 m^3 --imperialCup :: Fractional a => Unit 'NonMetric DVolume a -- | One imperial gill is one quarter of an imperialPint. -- -- See here for further information. -- --
-- >>> 1 *~ imperialGill -- 1.420653125e-4 m^3 ---- --
-- >>> 1 *~ imperialGill :: Volume Rational -- 454609 % 3200000000 m^3 --imperialGill :: Fractional a => Unit 'NonMetric DVolume a -- | One imperial fluid ounce is one twentieth of an imperialPint. -- -- See here for further information. -- --
-- >>> 1 *~ imperialFluidOunce -- 2.84130625e-5 m^3 ---- --
-- >>> 1 *~ imperialFluidOunce :: Volume Rational -- 454609 % 16000000000 m^3 --imperialFluidOunce :: Fractional a => Unit 'NonMetric DVolume a -- | One US liquid gallon is a volume of 231 cubic inches. -- -- See here for further information. -- --
-- >>> 1 *~ usGallon -- 3.785411784e-3 m^3 ---- --
-- >>> 1 *~ usGallon :: Volume Rational -- 473176473 % 125000000000 m^3 --usGallon :: Fractional a => Unit 'NonMetric DVolume a -- | One US liquid quart is one quarter of a usGallon. -- -- See here for further information. -- --
-- >>> 1 *~ usQuart -- 9.46352946e-4 m^3 ---- --
-- >>> 1 *~ usQuart :: Volume Rational -- 473176473 % 500000000000 m^3 --usQuart :: Fractional a => Unit 'NonMetric DVolume a -- | One US liquid pint is one half of a usQuart. -- -- See here for further information. -- --
-- >>> 1 *~ usPint -- 4.73176473e-4 m^3 ---- --
-- >>> 1 *~ usPint :: Volume Rational -- 473176473 % 1000000000000 m^3 --usPint :: Fractional a => Unit 'NonMetric DVolume a -- | One US liquid cup is one half of a usPint. -- -- See here for further information. -- --
-- >>> 1 *~ usCup -- 2.365882365e-4 m^3 ---- --
-- >>> 1 *~ usCup :: Volume Rational -- 473176473 % 2000000000000 m^3 --usCup :: Fractional a => Unit 'NonMetric DVolume a -- | One US liquid gill is one half of a usCup. -- -- See here for further information. -- --
-- >>> 1 *~ usGill -- 1.1829411825e-4 m^3 ---- --
-- >>> 1 *~ usGill :: Volume Rational -- 473176473 % 4000000000000 m^3 --usGill :: Fractional a => Unit 'NonMetric DVolume a -- | One US fluid ounce is 1128 usGallon or 18 usCup. -- -- See here for further information. -- --
-- >>> 1 *~ usFluidOunce -- 2.95735295625e-5 m^3 ---- --
-- >>> 1 *~ usFluidOunce :: Volume Rational -- 473176473 % 16000000000000 m^3 --usFluidOunce :: Fractional a => Unit 'NonMetric DVolume a -- | One Ångström is 1/10 nano meter. -- -- See here for further information. -- --
-- >>> 1 *~ angstrom -- 1.0e-10 m ---- --
-- >>> 1 *~ angstrom :: Length Rational -- 1 % 10000000000 m --angstrom :: Fractional a => Unit 'NonMetric DLength a -- | One Gauss is 1/10000 tesla. -- -- See here for further information. -- --
-- >>> 1 *~ gauss -- 1.0e-4 kg s^-2 A^-1 ---- --
-- >>> 1 *~ gauss :: MagneticFluxDensity Rational -- 1 % 10000 kg s^-2 A^-1 --gauss :: Fractional a => Unit 'NonMetric DMagneticFluxDensity a -- | Defines convenience functions for inspecting and manipulating -- quantities with RealFloat floating-point representations. -- -- The dimensionally-typed versions of functions from Patrick Perry's -- ieee754 package copy that package's API as closely as -- possible, by permission. In turn they are based on the tango -- math library for the D language. module Numeric.Units.Dimensional.Float -- | True if the representation of the argument is too small to be -- represented in normalized format. isDenormalized :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is an IEEE infinity -- or negative infinity. -- --
-- >>> isInfinite (_1 / _0) -- True ---- --
-- >>> isInfinite (42 *~ micro farad) -- False --isInfinite :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is an IEEE -- "not-a-number" (NaN) value. -- --
-- >>> isNaN _3 -- False ---- --
-- >>> isNaN (_1 / _0) -- False ---- --
-- >>> isNaN (asin _4) -- True --isNaN :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is an IEEE negative -- zero. -- --
-- >>> isNegativeZero _0 -- False ---- --
-- >>> isNegativeZero $ (-1e-200 *~ one) * (1e-200 *~ one) -- True --isNegativeZero :: RealFloat a => Quantity d a -> Bool -- | True if the representation of the argument is a number and is -- not infinite. -- --
-- >>> isFiniteNumber (_1 / _0) -- False ---- --
-- >>> isFiniteNumber (_0 / _0) -- False ---- --
-- >>> isFiniteNumber (_3 / _2) -- True --isFiniteNumber :: RealFloat a => Quantity d a -> Bool -- | Multiplies a floating-point quantity by an integer power of the radix -- of the representation type. -- -- Use floatRadix to determine the radix. -- --
-- >>> let x = 3 *~ meter -- -- >>> scaleFloat 3 x -- 24.0 m --scaleFloat :: RealFloat a => Int -> Quantity d a -> Quantity d a -- | An infinite floating-point quantity. infinity :: IEEE a => Quantity d a -- | The smallest representable positive quantity whose representation is -- normalized. minNormal :: IEEE a => Quantity d a -- | The largest representable finite floating-point quantity. maxFinite :: IEEE a => Quantity d a -- | The smallest positive value x such that _1 + x is -- representable. epsilon :: IEEE a => Dimensionless a -- | Default NaN quantity. nan :: IEEE a => Quantity d a -- | Return the next smallest representable floating-point quantity -- (Infinity and NaN are unchanged). predIEEE :: IEEE a => Quantity d a -> Quantity d a -- | Return the next largest representable floating-point quantity -- (Infinity and NaN are unchanged). succIEEE :: IEEE a => Quantity d a -> Quantity d a -- | Given two floating-point quantities with the same sign, return the -- quantity whose representation is halfway between their representations -- on the IEEE number line. If the signs of the values differ or either -- is NaN, the value is undefined. bisectIEEE :: IEEE a => Quantity d a -> Quantity d a -> Quantity d a -- | copySign x y returns the quantity x with its sign -- changed to match that of y. copySign :: IEEE a => Quantity d a -> Quantity d a -> Quantity d a -- | Quiet NaN quantity with a positive integer payload. Payload -- must be less than maxNaNPayload of the representation type. -- -- Beware that while some platforms allow using 0 as a payload, this -- behavior is not portable. nanWithPayload :: IEEE a => Word64 -> Quantity d a -- | The payload stored in a NaN quantity. Undefined if the -- argument is not NaN. nanPayload :: IEEE a => Quantity d a -> Word64 -- | Maximum NaN payload for type a. maxNaNPayload :: IEEE a => a -> Word64 -- | Return True if two floating-point quantities are exactly -- (bitwise) equal. identicalIEEE :: IEEE a => Quantity d a -> Quantity d a -> Bool -- | Return the minimum of two quantities; if one value is NaN, -- return the other. Prefer the first if both values are NaN. minNum :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Return the maximum of two quantities; if one value is NaN, -- return the other. Prefer the first if both values are NaN. maxNum :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Return the minimum of two quantities; if one value is NaN, -- return it. Prefer the first if both values are NaN. minNaN :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Return the maximum of two quantities; if one value is NaN, -- return it. Prefer the first if both values are NaN. maxNaN :: RealFloat a => Quantity d a -> Quantity d a -> Quantity d a -- | Defines types for manipulation of quantities with fixed point -- representations. module Numeric.Units.Dimensional.FixedPoint -- | A dimensional value, either a Quantity or a Unit, -- parameterized by its Dimension and representation. data family 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: -- --