At 2001-02-11 21:18, Tom Pledger wrote:
The main complication is that the type system needs to deal with integer exponents of dimensions, if it's to do the job well.
Very occasionally non-integer or 'fractal' exponents of dimensions are useful. For instance, geographic coastlines can be measured in km ^ n, where 1 <= n < 2. This doesn't stop the CIA world factbook listing all coastline lengths in straight kilometres, however. More unit weirdness occurs with logarithms. For instance, if y and x are distances, log (y/x) = log y - log x. Note that 'log x' is some number + log (metre). Strange, huh? Interestingly, in C++ you can parameterise types by values. For instance: -- // Mass, Length and Time template <long M,long L,long T> class Unit { public: double mValue; inline explicit Unit(double value) { mValue = value; } }; template <long M,long L,long T> Unit<M,L,T> operator + (Unit<M,L,T> a,Unit<M,L,T> b) { return Unit<M,L,T>(a.mValue + b.mValue); } template <long Ma,long La,long Ta,long Mb,long Lb,long Tb> Unit<Ma+Mb,La+Lb,Ta+Tb> operator * (Unit<Ma,La,Ta> a,Unit<Mb,Lb,Tb> b) { return Unit<Ma+Mb,La+Lb,Ta+Tb>(a.mValue * b.mValue); } // etc. int main() { Unit<0,1,0> oneMetre(1); Unit<0,1,0> twoMetres = oneMetre + oneMetre; Unit<0,2,0> oneSquareMetre = oneMetre * oneMetre; } -- Can you do this sort of thing in Haskell? -- Ashley Yakeley, Seattle WA