numeric-prelude-0.4.3: An experimental alternative hierarchy of numeric type classes

Safe HaskellSafe
LanguageHaskell98

Algebra.DimensionTerm

Contents

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 multi-parameter 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

Documentation

class Show a => C a #

Instances

C Voltage # 
C Information # 
C Temperature # 
C Angle # 
C Charge # 
C Mass # 
C Time # 
C Length # 
C Scalar # 
C a => C (Recip a) # 
(C a, C b) => C (Mul a b) # 

noValue :: C a => a #

Type constructors

data Scalar #

Constructors

Scalar 

data Mul a b #

Constructors

Mul 

Instances

(Show a, Show b) => Show (Mul a b) # 

Methods

showsPrec :: Int -> Mul a b -> ShowS #

show :: Mul a b -> String #

showList :: [Mul a b] -> ShowS #

(C a, C b) => C (Mul a b) # 

data Recip a #

Constructors

Recip 

Instances

Show a => Show (Recip a) # 

Methods

showsPrec :: Int -> Recip a -> ShowS #

show :: Recip a -> String #

showList :: [Recip a] -> ShowS #

C a => C (Recip a) # 

type Sqr a = Mul a a #

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 infixl 7 #

(%/%) :: (C a, C b) => a -> b -> Mul a (Recip b) infixl 7 #

Rewrites

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) #

Example dimensions

Scalar

class C dim => IsScalar dim where #

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

Minimal complete definition

toScalar, fromScalar

Methods

toScalar :: dim -> Scalar #

fromScalar :: Scalar -> dim #

Basis dimensions

data Length #

Constructors

Length 

Instances

data Time #

Constructors

Time 

Instances

Show Time # 

Methods

showsPrec :: Int -> Time -> ShowS #

show :: Time -> String #

showList :: [Time] -> ShowS #

C Time # 

data Mass #

Constructors

Mass 

Instances

Show Mass # 

Methods

showsPrec :: Int -> Mass -> ShowS #

show :: Mass -> String #

showList :: [Mass] -> ShowS #

C Mass # 

data Charge #

Constructors

Charge 

Instances

data Angle #

Constructors

Angle 

Instances

Show Angle # 

Methods

showsPrec :: Int -> Angle -> ShowS #

show :: Angle -> String #

showList :: [Angle] -> ShowS #

C Angle # 

Derived dimensions

data Voltage #

Constructors

Voltage 

Instances