
Algebra.DimensionTerm  Portability  portable  Stability  provisional  Maintainer  numericprelude@henningthielemann.de 





Description 
We already have the dynamically checked physical units
provided by Number.Physical
and the statically checked ones of the dimensional package of Buckwalter,
which require multiparameter type classes with functional dependencies.
Here we provide a poor man's approach:
The units are presented by type terms.
There is no canonical form and thus the type checker
can not automatically check for equal units.
However, if two unit terms represent the same unit,
then you can tell the type checker to rewrite one into the other.
You can add more dimensions by introducing more types of class C.
This approach is not entirely safe
because you can write your own flawed rewrite rules.
It is however more safe than with no units at all.


Synopsis 

class Show a => C a   noValue :: C a => a   data Scalar = Scalar   data Mul a b = Mul   data Recip a = Recip   type Sqr a = Mul a a   appPrec :: Int   scalar :: Scalar   mul :: (C a, C b) => a > b > Mul a b   recip :: C a => a > Recip a   (%*%) :: (C a, C b) => a > b > Mul a b   (%/%) :: (C a, C b) => a > b > Mul a (Recip b)   applyLeftMul :: (C u0, C u1, C v) => (u0 > u1) > Mul u0 v > Mul u1 v   applyRightMul :: (C u0, C u1, C v) => (u0 > u1) > Mul v u0 > Mul v u1   applyRecip :: (C u0, C u1) => (u0 > u1) > Recip u0 > Recip u1   commute :: (C u0, C u1) => Mul u0 u1 > Mul u1 u0   associateLeft :: (C u0, C u1, C u2) => Mul u0 (Mul u1 u2) > Mul (Mul u0 u1) u2   associateRight :: (C u0, C u1, C u2) => Mul (Mul u0 u1) u2 > Mul u0 (Mul u1 u2)   recipMul :: (C u0, C u1) => Recip (Mul u0 u1) > Mul (Recip u0) (Recip u1)   mulRecip :: (C u0, C u1) => Mul (Recip u0) (Recip u1) > Recip (Mul u0 u1)   identityLeft :: C u => Mul Scalar u > u   identityRight :: C u => Mul u Scalar > u   cancelLeft :: C u => Mul (Recip u) u > Scalar   cancelRight :: C u => Mul u (Recip u) > Scalar   invertRecip :: C u => Recip (Recip u) > u   doubleRecip :: C u => u > Recip (Recip u)   recipScalar :: Recip Scalar > Scalar   class C dim => IsScalar dim where    data Length = Length   data Time = Time   data Mass = Mass   data Charge = Charge   data Angle = Angle   data Temperature = Temperature   data Information = Information   length :: Length   time :: Time   mass :: Mass   charge :: Charge   angle :: Angle   temperature :: Temperature   information :: Information   type Frequency = Recip Time   frequency :: Frequency   data Voltage = Voltage   type VoltageAnalytical = Mul (Mul (Sqr Length) Mass) (Recip (Mul (Sqr Time) Charge))   voltage :: Voltage   unpackVoltage :: Voltage > VoltageAnalytical   packVoltage :: VoltageAnalytical > Voltage 


Documentation 


 Instances  




Type constructors



Constructors   Instances  



Constructors   Instances  



Constructors   Instances  
















Rewrites


applyLeftMul :: (C u0, C u1, C v) => (u0 > u1) > Mul u0 v > Mul u1 v  Source 


applyRightMul :: (C u0, C u1, C v) => (u0 > u1) > Mul v u0 > Mul v u1  Source 




























Example dimensions


Scalar


class C dim => IsScalar dim where  Source 

This class allows defining instances that are exclusively for Scalar dimension.
You won't want to define instances by yourself.
  Methods    Instances  


Basis dimensions



Constructors   Instances  



Constructors   Instances  



Constructors   Instances  



Constructors   Instances  



Constructors   Instances  



Constructors   Instances  



Constructors   Instances  
















Derived dimensions







Constructors   Instances  










Produced by Haddock version 2.4.2 