-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Statically checked physical dimensions. -- -- Dimensional is a library providing data types for performing -- arithmetic with physical quantities and units. Information about the -- physical dimensions of the quantities and units is embedded in their -- types and the validity of operations is verified by the type checker -- at compile time. The 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. Requires GHC 6.6.1 or later. @package dimensional @version 0.8 -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.Units.Dimensional newtype Dimensional v d a Dimensional :: a -> Dimensional v d a data DUnit data DQuantity type Unit = Dimensional DUnit type Quantity = Dimensional DQuantity (*~) :: (Num a) => a -> Unit d a -> Quantity d a (/~) :: (Fractional a) => Quantity d a -> Unit d a -> a data Dim l m t i th n j 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 class Mul d d' d'' | d d' -> d'' class Div d d' d'' | d d' -> d'' class (NumType x) => Pow d x d' | d x -> d' class (NonZero x) => Root d x d' | d x -> d' (*) :: (Num a, Mul d d' d'') => Dimensional v d a -> Dimensional v d' a -> Dimensional v d'' a (/) :: (Fractional a, Div d d' d'') => Dimensional v d a -> Dimensional v d' a -> Dimensional v d'' a (^) :: (Fractional a, Pow d n d') => Dimensional v d a -> n -> Dimensional v d' a (^+) :: (Num a, PosType n, Pow d n d') => Dimensional v d a -> n -> Dimensional v d' a negate :: (Num a) => Quantity d a -> Quantity d a (+) :: (Num a) => Quantity d a -> Quantity d a -> Quantity d a (-) :: (Num a) => Quantity d a -> Quantity d a -> Quantity d a abs :: (Num a) => Quantity d a -> Quantity d a nroot :: (Floating a, Root d n d') => n -> Dimensional v d a -> Dimensional v d' a sqrt :: (Floating a, Root d Pos2 d') => Dimensional v d a -> Dimensional v d' a cbrt :: (Floating a, Root d Pos3 d') => Dimensional v d a -> Dimensional v d' a (^/) :: (Floating a, Root d n d') => Dimensional v d a -> n -> Dimensional v d' a (*~~) :: (Num a) => [a] -> Unit d a -> [Quantity d a] (/~~) :: (Fractional a) => [Quantity d a] -> Unit d a -> [a] sum :: (Num a) => [Quantity d a] -> Quantity d a dimensionlessLength :: (Num a) => [Dimensional v d 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 exp :: (Floating a) => Dimensionless a -> Dimensionless a (**) :: (Floating a) => Dimensionless a -> Dimensionless a -> Dimensionless a atan2 :: (RealFloat a) => Quantity d a -> Quantity d a -> Dimensionless a one :: (Num a) => Unit DOne a _1 :: (Num a) => Dimensionless a _2 :: (Num a) => Dimensionless a _3 :: (Num a) => Dimensionless a _4 :: (Num a) => Dimensionless a _0 :: (Num a) => Dimensionless a pi :: (Floating a) => Dimensionless a dimUnit :: (NumType n) => String -> n -> Maybe String prefix :: (Num a) => a -> Unit d a -> Unit d a instance (Eq a) => Eq (Dimensional v d a) instance (Ord a) => Ord (Dimensional v d a) instance (NumType l, NumType m, NumType t, NumType i, NumType th, NumType n, NumType j) => Show (Dim l m t i th n j) instance (Show d, Show a) => Show (Quantity d a) instance Functor Dimensionless instance (Div l x l', Div m x m', Div t x t', Div i x i', Div th x th', Div n x n', Div j x j') => Root (Dim l m t i th n j) x (Dim l' m' t' i' th' n' j') instance (Mul l x l', Mul m x m', Mul t x t', Mul i x i', Mul th x th', Mul n x n', Mul j x j') => Pow (Dim l m t i th n j) x (Dim l' m' t' i' th' n' j') instance (Sum l l' l'', Sum m m' m'', Sum t t' t'', Sum i i' i'', Sum th th' th'', Sum n n' n'', Sum j j' j'') => Div (Dim l'' m'' t'' i'' th'' n'' j'') (Dim l' m' t' i' th' n' j') (Dim l m t i th n j) instance (Sum l l' l'', Sum m m' m'', Sum t t' t'', Sum i i' i'', Sum th th' th'', Sum n n' n'', Sum j j' j'') => Mul (Dim l m t i th n j) (Dim l' m' t' i' th' n' j') (Dim l'' m'' t'' i'' th'' n'' j'') -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.Units.Dimensional.Quantities type DArea = Dim Pos2 Zero Zero Zero Zero Zero Zero type Area = Quantity DArea type DVolume = Dim Pos3 Zero Zero Zero Zero Zero Zero type Volume = Quantity DVolume type DVelocity = Dim Pos1 Zero Neg1 Zero Zero Zero Zero type Velocity = Quantity DVelocity type DAcceleration = Dim Pos1 Zero Neg2 Zero Zero Zero Zero type Acceleration = Quantity DAcceleration type DWaveNumber = Dim Neg1 Zero Zero Zero Zero Zero Zero type WaveNumber = Quantity DWaveNumber type DMassDensity = Dim Neg3 Pos1 Zero Zero Zero Zero Zero type MassDensity = Quantity DMassDensity type Density = MassDensity type DSpecificVolume = Dim Pos3 Neg1 Zero Zero Zero Zero Zero type SpecificVolume = Quantity DSpecificVolume type DCurrentDensity = Dim Neg2 Zero Zero Pos1 Zero Zero Zero type CurrentDensity = Quantity DCurrentDensity type DMagneticFieldStrength = Dim Neg1 Zero Zero Pos1 Zero Zero Zero type MagneticFieldStrength = Quantity DMagneticFieldStrength type DAmountOfSubstanceConcentration = Dim Neg3 Zero Zero Zero Zero Pos1 Zero type AmountOfSubstanceConcentration = Quantity DAmountOfSubstanceConcentration type Concentration = AmountOfSubstanceConcentration type DLuminance = Dim Neg2 Zero Zero Zero Zero Zero Pos1 type Luminance = Quantity DLuminance square :: (Num a) => Unit DLength a -> Unit DArea a cubic :: (Num a) => Unit DLength a -> Unit DVolume a type DPlaneAngle = DOne type PlaneAngle = Dimensionless type DSolidAngle = DOne type SolidAngle = Dimensionless type DFrequency = Dim Zero Zero Neg1 Zero Zero Zero Zero type Frequency = Quantity DFrequency type DForce = Dim Pos1 Pos1 Neg2 Zero Zero Zero Zero type Force = Quantity DForce type DPressure = Dim Neg1 Pos1 Neg2 Zero Zero Zero Zero type DStress = DPressure type Pressure = Quantity DPressure type Stress = Quantity DStress type DEnergy = Dim Pos2 Pos1 Neg2 Zero Zero Zero Zero type DWork = DEnergy type DQuantityOfHeat = DEnergy type Energy = Quantity DEnergy type Work = Quantity DWork type QuantityOfHeat = Quantity DQuantityOfHeat type DPower = Dim Pos2 Pos1 Neg3 Zero Zero Zero Zero type DRadiantFlux = DPower type Power = Quantity DPower type RadiantFlux = Quantity DRadiantFlux type DElectricCharge = Dim Zero Zero Pos1 Pos1 Zero Zero Zero type DQuantityOfElectricity = DElectricCharge type ElectricCharge = Quantity DElectricCharge type QuantityOfElectricity = Quantity DQuantityOfElectricity type DElectricPotential = Dim Pos2 Pos1 Neg3 Neg1 Zero Zero Zero type DPotentialDifference = DElectricPotential type DElectromotiveForce = DElectricPotential type ElectricPotential = Quantity DElectricPotential type PotentialDifference = Quantity DPotentialDifference type ElectromotiveForce = Quantity DElectromotiveForce type DCapacitance = Dim Neg2 Neg1 Pos4 Pos2 Zero Zero Zero type Capacitance = Quantity DCapacitance type DElectricResistance = Dim Pos2 Pos1 Neg3 Neg2 Zero Zero Zero type ElectricResistance = Quantity DElectricResistance type DElectricConductance = Dim Neg2 Neg1 Pos3 Pos2 Zero Zero Zero type ElectricConductance = Quantity DElectricConductance type DMagneticFlux = Dim Pos2 Pos1 Neg2 Neg1 Zero Zero Zero type MagneticFlux = Quantity DMagneticFlux type DMagneticFluxDensity = Dim Zero Pos1 Neg2 Neg1 Zero Zero Zero type MagneticFluxDensity = Quantity DMagneticFluxDensity type DInductance = Dim Pos2 Pos1 Neg2 Neg2 Zero Zero Zero type Inductance = Quantity DInductance type DLuminousFlux = DLuminousIntensity type LuminousFlux = Quantity DLuminousFlux type DIlluminance = Dim Neg2 Zero Zero Zero Zero Zero Pos1 type Illuminance = Quantity DIlluminance type DCelsiusTemperature = DThermodynamicTemperature type CelsiusTemperature = Quantity DCelsiusTemperature type DActivity = DFrequency type Activity = Quantity DActivity type DAbsorbedDose = Dim Pos2 Zero Neg2 Zero Zero Zero Zero type DSpecificEnergy = DAbsorbedDose type DKerma = DAbsorbedDose type AbsorbedDose = Quantity DAbsorbedDose type SpecificEnergy = Quantity DSpecificEnergy type Kerma = Quantity DKerma type DDoseEquivalent = DAbsorbedDose type DAmbientDoseEquivalent = DDoseEquivalent type DDirectionalDoseEquivalent = DDoseEquivalent type DPersonalDoseEquivalent = DDoseEquivalent type DEquivalentDose = DDoseEquivalent type DoseEquivalent = Quantity DDoseEquivalent type AmbientDoseEquivalent = DoseEquivalent type DirectionalDoseEquivalent = DoseEquivalent type PersonalDoseEquivalent = DoseEquivalent type EquivalentDose = DoseEquivalent type DAngularVelocity = DFrequency type AngularVelocity = Quantity DAngularVelocity type DAngularAcceleration = Dim Zero Zero Neg2 Zero Zero Zero Zero type AngularAcceleration = Quantity DAngularAcceleration type DDynamicViscosity = Dim Neg1 Pos1 Neg1 Zero Zero Zero Zero type DynamicViscosity = Quantity DDynamicViscosity type DMomentOfForce = DEnergy type MomentOfForce = Quantity DMomentOfForce type DSurfaceTension = Dim Zero Pos1 Neg2 Zero Zero Zero Zero type SurfaceTension = Quantity DSurfaceTension type DHeatFluxDensity = Dim Zero Pos1 Neg3 Zero Zero Zero Zero type DIrradiance = DHeatFluxDensity type HeatFluxDensity = Quantity DHeatFluxDensity type Irradiance = Quantity DIrradiance type DRadiantIntensity = DPower type RadiantIntensity = Quantity DRadiantIntensity type DRadiance = DIrradiance type Radiance = Quantity DRadiance type DHeatCapacity = Dim Pos2 Pos1 Neg2 Zero Neg1 Zero Zero type DEntropy = DHeatCapacity type HeatCapacity = Quantity DHeatCapacity type Entropy = Quantity DEntropy type DSpecificHeatCapacity = Dim Pos2 Zero Neg2 Zero Neg1 Zero Zero type DSpecificEntropy = DSpecificHeatCapacity type SpecificHeatCapacity = Quantity DSpecificHeatCapacity type SpecificEntropy = Quantity DSpecificEntropy type DThermalConductivity = Dim Pos1 Pos1 Neg3 Zero Neg1 Zero Zero type ThermalConductivity = Quantity DThermalConductivity type DEnergyDensity = DPressure type EnergyDensity = Quantity DEnergyDensity type DElectricFieldStrength = Dim Pos1 Pos1 Neg3 Neg1 Zero Zero Zero type ElectricFieldStrength = Quantity DElectricFieldStrength type DElectricChargeDensity = Dim Neg3 Zero Pos1 Pos1 Zero Zero Zero type ElectricChargeDensity = Quantity DElectricChargeDensity type DElectricFluxDensity = Dim Neg2 Zero Pos1 Pos1 Zero Zero Zero type ElectricFluxDensity = Quantity DElectricFluxDensity type DPermittivity = Dim Neg3 Neg1 Pos4 Pos2 Zero Zero Zero type Permittivity = Quantity DPermittivity type DPermeability = Dim Pos1 Pos1 Neg2 Neg2 Zero Zero Zero type Permeability = Quantity DPermeability type DMolarEnergy = Dim Pos2 Pos1 Neg2 Zero Zero Neg1 Zero type MolarEnergy = Quantity DMolarEnergy type DMolarEntropy = Dim Pos2 Pos1 Neg2 Zero Neg1 Neg1 Zero type DMolarHeatCapacity = DMolarEntropy type MolarEntropy = Quantity DMolarEntropy type MolarHeatCapacity = Quantity DMolarHeatCapacity type DExposure = Dim Zero Neg1 Pos1 Pos1 Zero Zero Zero type Exposure = Quantity DExposure type DAbsorbedDoseRate = Dim Pos2 Zero Neg3 Zero Zero Zero Zero type AbsorbedDoseRate = Quantity DAbsorbedDoseRate type DImpulse = Dim Pos1 Pos1 Neg1 Zero Zero Zero Zero type Impulse = Quantity DImpulse type DMassFlow = Dim Zero Pos1 Neg1 Zero Zero Zero Zero type MassFlow = Quantity DMassFlow type DGravitationalParameter = Dim Pos3 Zero Neg2 Zero Zero Zero Zero type GravitationalParameter = Quantity DGravitationalParameter type Angle = PlaneAngle type Thrust = Force type EnergyPerUnitMass = SpecificEnergy -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.Units.Dimensional.SIUnits deca :: (Num a) => Unit d a -> Unit d a hecto :: (Num a) => Unit d a -> Unit d a kilo :: (Num a) => Unit d a -> Unit d a mega :: (Num a) => Unit d a -> Unit d a giga :: (Num a) => Unit d a -> Unit d a tera :: (Num a) => Unit d a -> Unit d a peta :: (Num a) => Unit d a -> Unit d a exa :: (Num a) => Unit d a -> Unit d a zetta :: (Num a) => Unit d a -> Unit d a yotta :: (Num a) => Unit d a -> Unit d a deka :: (Num a) => Unit d a -> Unit d a centi :: (Fractional a) => Unit d a -> Unit d a milli :: (Fractional a) => Unit d a -> Unit d a micro :: (Fractional a) => Unit d a -> Unit d a nano :: (Fractional a) => Unit d a -> Unit d a pico :: (Fractional a) => Unit d a -> Unit d a femto :: (Fractional a) => Unit d a -> Unit d a atto :: (Fractional a) => Unit d a -> Unit d a zepto :: (Fractional a) => Unit d a -> Unit d a yocto :: (Fractional a) => Unit d a -> Unit d a deci :: (Fractional a) => Unit d a -> Unit d a meter :: (Num a) => Unit DLength a metre :: (Num a) => Unit DLength a gram :: (Fractional a) => Unit DMass a second :: (Num a) => Unit DTime a ampere :: (Num a) => Unit DElectricCurrent a kelvin :: (Num a) => Unit DThermodynamicTemperature a mole :: (Num a) => Unit DAmountOfSubstance a candela :: (Num a) => Unit DLuminousIntensity a fromDiffTime :: (Fractional a) => DiffTime -> Time a toDiffTime :: (Real a, Fractional a) => Time a -> DiffTime radian :: (Fractional a) => Unit DPlaneAngle a steradian :: (Fractional a) => Unit DSolidAngle a hertz :: (Fractional a) => Unit DFrequency a newton :: (Fractional a) => Unit DForce a pascal :: (Fractional a) => Unit DPressure a joule :: (Fractional a) => Unit DEnergy a watt :: (Fractional a) => Unit DPower a coulomb :: (Fractional a) => Unit DElectricCharge a volt :: (Fractional a) => Unit DElectricPotential a farad :: (Fractional a) => Unit DCapacitance a ohm :: (Fractional a) => Unit DElectricResistance a siemens :: (Fractional a) => Unit DElectricConductance a weber :: (Fractional a) => Unit DMagneticFlux a tesla :: (Fractional a) => Unit DMagneticFluxDensity a henry :: (Fractional a) => Unit DInductance a lumen :: (Fractional a) => Unit DLuminousFlux a lux :: (Fractional a) => Unit DIlluminance a degreeCelsius :: (Num a) => Unit DCelsiusTemperature a fromDegreeCelsiusAbsolute :: (Fractional a) => a -> ThermodynamicTemperature a toDegreeCelsiusAbsolute :: (Fractional a) => ThermodynamicTemperature a -> a becquerel :: (Fractional a) => Unit DActivity a gray :: (Fractional a) => Unit DAbsorbedDose a sievert :: (Fractional a) => Unit DDoseEquivalent a hour :: (Num a) => Unit DTime a day :: (Num a) => Unit DTime a minute :: (Num a) => Unit DTime a arcminute :: (Floating a) => Unit DPlaneAngle a arcsecond :: (Floating a) => Unit DPlaneAngle a degree :: (Floating a) => Unit DPlaneAngle a minuteOfArc :: (Floating a) => Unit DPlaneAngle a secondOfArc :: (Floating a) => Unit DPlaneAngle a degreeOfArc :: (Floating a) => Unit DPlaneAngle a liter :: (Fractional a) => Unit DVolume a litre :: (Fractional a) => Unit DVolume a metricTon :: (Fractional a) => Unit DMass a tonne :: (Fractional a) => Unit DMass a module Numeric.Units.Dimensional.Prelude -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.Units.Dimensional.NonSI electronVolt :: (Fractional a) => Unit DEnergy a unifiedAtomicMassUnit :: (Fractional a) => Unit DMass a foot :: (Fractional a) => Unit DLength a inch :: (Fractional a) => Unit DLength a ounce :: (Fractional a) => Unit DMass a poundMass :: (Fractional a) => Unit DMass a gee :: (Fractional a) => Unit DAcceleration a poundForce :: (Fractional a) => Unit DForce a mile :: (Fractional a) => Unit DLength a nauticalMile :: (Fractional a) => Unit DLength a yard :: (Fractional a) => Unit DLength a revolution :: (Floating a) => Unit DOne a bar :: (Fractional a) => Unit DPressure a teaspoon :: (Fractional a) => Unit DVolume a century :: (Num a) => Unit DTime a year :: (Num a) => Unit DTime a -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.Units.Dimensional.Extensible data DExt a n d showDExt :: (NumType n, Show d) => String -> DExt a n d -> String instance (Div n x n', Root d x d') => Root (DExt a n d) x (DExt a n' d') instance (Mul n x n', Pow d x d') => Pow (DExt a n d) x (DExt a n' d') instance (Sum n'' n' n, Div d d' d'', DropZero (DExt a n'' d'') d''') => Div (DExt a n d) (DExt a n' d') d''' instance (Div (Dim l m t i th n j) d d', Negate x x') => Div (Dim l m t i th n j) (DExt a x d) (DExt a x' d') instance (Div d (Dim l m t i th n j) d') => Div (DExt a x d) (Dim l m t i th n j) (DExt a x d') instance (Sum n n' n'', Mul d d' d'', DropZero (DExt a n'' d'') d''') => Mul (DExt a n d) (DExt a n' d') d''' instance (Mul (Dim l m t i th n j) d d') => Mul (Dim l m t i th n j) (DExt a x d) (DExt a x d') instance (Mul d (Dim l m t i th n j) d') => Mul (DExt a x d) (Dim l m t i th n j) (DExt a x d') instance DropZero (DExt a (Neg n) d) (DExt a (Neg n) d) instance DropZero (DExt a (Pos n) d) (DExt a (Pos n) d) instance DropZero (DExt a Zero (DExt a' n d)) (DExt a Zero (DExt a' n d)) instance DropZero (DExt a Zero (Dim l m t i th n j)) (Dim l m t i th j j) -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.Units.Dimensional.CGS data CGSDim lh mh t type DLength = CGSDim Pos2 Zero Zero type DMass = CGSDim Zero Pos2 Zero type DTime = CGSDim Zero Zero Pos1 type DElectricCurrent = CGSDim Pos3 Pos1 Neg2 type DCharge = CGSDim Pos3 Pos1 Neg1 meter :: (Num a) => Unit DLength a gram :: (Num a) => Unit DMass a second :: (Num a) => Unit DTime a ampere :: (Floating a) => Unit DElectricCurrent a franklin :: (Floating a) => Unit DCharge a unit_SI :: (Num a) => Quantity (Dim l m t i th n j) a -> Unit (Dim l m t i th n j) a unit_CGS :: (Floating a, Mul Zero l Zero, Mul Pos2 l l2, Mul Zero m Zero, Mul Pos2 m m2, Mul Zero t Zero, Mul Pos1 t t, Sum l2 Zero l2, Sum Zero m2 m2, Sum m2 Zero m2, Sum Zero t t, Mul Pos3 i il, Mul Pos1 i i, Mul Neg2 i it, Sum l2 il l', Sum m2 i m', Sum t it t') => Quantity (Dim l m t i Zero Zero Zero) a -> Unit (CGSDim l' m' t') a toSI :: (Floating a, Mul Zero l Zero, Mul Pos2 l l2, Mul Zero m Zero, Mul Pos2 m m2, Mul Zero t Zero, Mul Pos1 t t, Sum l2 Zero l2, Sum Zero m2 m2, Sum m2 Zero m2, Sum Zero t t, Mul Pos3 i il, Mul Pos1 i i, Mul Neg2 i it, Sum l2 il l', Sum m2 i m', Sum t it t') => Quantity (CGSDim l' m' t') a -> Quantity (Dim l m t i Zero Zero Zero) a instance (NumType lh, NumType mh, NumType t) => Show (CGSDim lh mh t) instance (Div lh x lh', Div mh x mh', Div t x t') => Root (CGSDim lh mh t) x (CGSDim lh' mh' t') instance (Mul lh x lh', Mul mh x mh', Mul t x t') => Pow (CGSDim lh mh t) x (CGSDim lh' mh' t') instance (Sum lh lh' lh'', Sum mh mh' mh'', Sum t t' t'') => Div (CGSDim lh'' mh'' t'') (CGSDim lh' mh' t') (CGSDim lh mh t) instance (Sum lh lh' lh'', Sum mh mh' mh'', Sum t t' t'') => Mul (CGSDim lh mh t) (CGSDim lh' mh' t') (CGSDim lh'' mh'' t'')