# CC: Functional dependencies question

**oleg@pobox.com
**
oleg@pobox.com

*Mon, 12 May 2003 20:55:55 -0700 (PDT)*

>* hbar :: (Mult Energy Time t) => t
*>* hbar = PhysicalUnit 6.62606876e-34
*
But what if we add to our library
joule::Energy = PhysicalUnit 1.0
cal::Energy = PhysicalUnit 4.8
second::Time = PhysicalUnit 1.0
nanosec::Time = PhysicalUnit 1.0e-9
and
scalarm:: Double -> (PhysicalUnit a1 b1 c1) -> (PhysicalUnit a1 b1 c1)
x `scalarm` (PhysicalUnit y) = PhysicalUnit $ x * y
then the user can write
hbar = 6.62606876e-34 `scalarm` (joule `mult` second)
or
hbar = 6.62606876e-25 `scalarm` (joule `mult` nanosec)
or
hbar = (6.62606876e-25/4.8) `scalarm` (cal `mult` nanosec)
Can't we? Or I'm missing something? GHC seems happy.
We can probably define in the library
transf:: (PhysicalUnit a1 b1 c1) -> (PhysicalUnit a1 b1 c1) -> Double
transf (PhysicalUnit x) (PhysicalUnit y) = x/y
and write
hbar = (6.62606876e-25/(cal `transf` joule)) `scalarm` (cal `mult` nanosec)
P.S.
Just for the record: yet another way to introduce negative numbers is
through an explicit constructor Neg. For example:
http://pobox.com/~oleg/ftp/Computation/type-arithmetics.html
(sorry, the code uses C++ templates. The idea is just the same
however: a mere Prolog in a more verbose notation). The above example
demonstrates division of signed Peano numbers. The Neg constructor
becomes quite handy then.