# Physical units

### From HaskellWiki

(Difference between revisions)

(ported from hawiki) |
(CalDims) |
||

Line 3: | Line 3: | ||

* It can. Look at [[Dimensionalized numbers]] for a toy implementation. I've thought a bit about the Geometric Algebra case, but I can't see a good way of handling it without forcing a choice of basis. I'm also not sure how it would work -- the whole point of GA is to incorporate areas, lengths, volumes, etc. into one number type. I suppose we could use this type of technique to segregate GA spaces with different dimensions or even metrics. --AaronDenney |
* It can. Look at [[Dimensionalized numbers]] for a toy implementation. I've thought a bit about the Geometric Algebra case, but I can't see a good way of handling it without forcing a choice of basis. I'm also not sure how it would work -- the whole point of GA is to incorporate areas, lengths, volumes, etc. into one number type. I suppose we could use this type of technique to segregate GA spaces with different dimensions or even metrics. --AaronDenney |
||

− | * I have implemented values equipped with physical units. Though all unit checking is made dynamically, that is expressions like <hask>1 * meter < 2 * second</hask> are accepted by the Haskell compiler but lead to a runtime error. -- HenningThielemann |
+ | * NumericPrelude also contains an implementation of values equipped with physical units. However all unit checking is made dynamically, that is expressions like <hask>1 * meter < 2 * second</hask> are accepted by the Haskell compiler but lead to a runtime error. This design allows multiplication of values with different units, but prohibits catching unit errors at compile time. Units are handled as integer vectors of exponents of base units. Computation with these vectors is rather simple, however formatting them is difficult. Formatting and parsing values with units is supported. A small library of SI units is provided. |

− | http://darcs.haskell.org/numericprelude/src/Number/Physical.hs |
+ | : http://darcs.haskell.org/numericprelude/src/Number/Physical.hs |

− | http://darcs.haskell.org/numericprelude/src/Number/SI.hs |
+ | : http://darcs.haskell.org/numericprelude/src/Number/SI.hs |

− | Get with |
+ | :Get with <code>darcs get http://darcs.haskell.org/numericprelude/</code> |

− | <code> |
+ | |

− | darcs get http://darcs.haskell.org/numericprelude/ |
+ | * [[CalDims]] |

− | </code> |
||

## Revision as of 14:02, 21 November 2006

How would one go about modeling units (seconds, meters, meters per second, etc) in Haskell? I'm particularly interested in getting the typechecker to verify proper usage, and do not want to restrict it to any particular numeric representation (i.e. both integral seconds and fractional seconds). If this can in fact be done, it could also be used to model coordinate system axes in, say, Geometric Algebra.

- It can. Look at Dimensionalized numbers for a toy implementation. I've thought a bit about the Geometric Algebra case, but I can't see a good way of handling it without forcing a choice of basis. I'm also not sure how it would work -- the whole point of GA is to incorporate areas, lengths, volumes, etc. into one number type. I suppose we could use this type of technique to segregate GA spaces with different dimensions or even metrics. --AaronDenney

- NumericPrelude also contains an implementation of values equipped with physical units. However all unit checking is made dynamically, that is expressions like are accepted by the Haskell compiler but lead to a runtime error. This design allows multiplication of values with different units, but prohibits catching unit errors at compile time. Units are handled as integer vectors of exponents of base units. Computation with these vectors is rather simple, however formatting them is difficult. Formatting and parsing values with units is supported. A small library of SI units is provided.1 * meter < 2 * second

- http://darcs.haskell.org/numericprelude/src/Number/Physical.hs
- http://darcs.haskell.org/numericprelude/src/Number/SI.hs

- Get with
`darcs get http://darcs.haskell.org/numericprelude/`