Alvin Schatte writes: > Is there a library or package that combines numbers and their > operations with dimensions that may be associated with them?
Apparently not, from what I learn from previous discussions on this list. Doing this well is actually far from trivial, in any language, but it would make for a nice research project that could lead to something practically very useful. There are two aspects to dealing with physical quantities, which I think are best considered separately: dimensions and units. Dimensions are length, time, volume, velocity, etc. Addition, subtraction, and comparison of quantities is allowed only when their dimensions are equal. Multiplication and division are allowed for any combination of dimension, but produce a result of a different dimension. Since dimensions impose constraints on allowed mathematical expressions, it is tempting to implement them as types and have a static type checker verify dimensional consistency at compile time. However, many (most?) type systems are not quite up to the task. I haven't looked at Typed Racket enough to be able to say if it could handle the task. Most dimension-checking approaches I have seen use dynamic typing with run-time checks. In fact, the only approaches I know of that use static type checking are Boost.Units for C++ (http://www.boost.org/doc/libs/1_54_0/doc/html/boost_units.html), and the units package for Haskell (http://hackage.haskell.org/package/units). The tricky aspect of dimensions when seen as types is there is an infinite number of dimensions, so it's not possible to provide an exhaustive list. Multiplying two lengths results in an area, which is the square of a length. Multiplying N lengths yields a quantity of dimension length^N, for any N. Every unit system has a finite number of base dimensions, in which every possible dimension can be expressed as a product of integer powers of the base dimensions. Some pathological unit systems even require fractional powers, but they are luckily disappearing quickly. Once you have dimensions, units are trivial to implement: every unit is simply a constant of the dimensional-quantity type. In fact, when you say "2 meters", you really mean "a length twice as long as the length we decided to call a meter". A meter is thus just a specific length value. Konrad. ____________________ Racket Users list: http://lists.racket-lang.org/users