# CC: Functional dependencies question

**Ashley Yakeley
**
ashley@semantic.org

*Wed, 21 May 2003 00:53:37 -0700*

In article <200305130355.h4D3ttcB013484@adric.fnmoc.navy.mil>,
oleg@pobox.com wrote:
>* 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.
*
I prefer NegativeSucc, i.e. -(n+1) or -n-1. My integer types are thus T
or NegativeSucc T for any natural type T, and the two don't overlap.
Another trick is to use the same class for addition and subtraction:
class Add a b ab | a b -> ab, ab a -> b;
I found you can't build the instances if you have all three possible
fundeps (because of overlaps), but you can with two.
<http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/hbase/Source/HBase/TypeCa
lc/>.
As for dimensions, what would be most interesting would be to allow the
user to add their own "basis" units, so for instance:
module MyModule where
import PhysicalUnits
-- new basis unit
type Cost = [whatever]
dollar :: Cost
dollar = [whatever]
goldValue :: (Div Mass Cost t) => t
goldValue = ...
...but that may be hard and/or messy.
--
Ashley Yakeley, Seattle WA