[Haskell-cafe] money type ?

Jeremy Shaw jeremy.shaw at linspireinc.com
Thu Jul 12 13:53:14 EDT 2007


At Thu, 12 Jul 2007 00:42:46 -0700,
Simon Michael wrote:
> 
> Good day all,
> 
> my budding ledger program could not balance transactions exactly because of 
> rounding error with Double. I *think* I got it working better with Rational 
> (it was late). Another suggestion from #haskell was to multiply all money 
> by 100. I'm tracking multiple currencies/commodities with varying precision 
> so this gets a bit more complicated.
> 
> Is there a type or library out there that's good for representing money and 
> other quantities while avoiding rounding errors  ?

Almost. I have a mostly complete Decimal library for Haskell available at:

http://www.n-heptane.com/nhlab/repos/Decimal/

It aims to meet the same goals the Python Money PEP:

http://www.python.org/dev/peps/pep-0327/

Most of the implementation details are described in this standard:

http://www2.hursley.ibm.com/decimal/

Currently there are two very significant bugs:

 1. the rounding algorithm is completely wrong

 2. In the division routine, I explicitly limit the number of digits
    after the decimal point to 9 places.

Using the Decimal library you can then implement a Money type similar
to what is show in:

http://www.n-heptane.com/nhlab/repos/Decimal/Money.hs

essentially, you declare a phantom data type like:

> data Money currency = Money Decimal

which you can then parameterize by different types of currency

> data Dollar = Dollar
> data Yen = Yen

> fiveDollars :: Money Dollar
> fiveDollars = 5

> fiveYen :: Money Yen
> fiveYen = 5

because the types are different, you won't be able to accidently
charge someone 5 yen instead of 5 dollars :)

However, you can still write currency agnostic functions:

> doubleMyIncome :: Money c -> Money c
> doubleMyIncome income = income * 2.0

So, the decimal library is almost, but not quite, usable. Fixing the
two (known) problems is not that hard, I just have not had the
time. Also, the library really needs a good test suite before it can
be considered suitable for an accounting program ;) Fortunately, the
python library already has a good test suite that can copied. I
believe the spec at IBM also includes a bunch of examples that could
be interegrated into a test suite. The library includes the beginnings
of a test suite, but it is not very complete.

I am definitely willing to give guidance and assistance if you, or
someone else, wants to help finish up the library.

j.


More information about the Haskell-Cafe mailing list