[Haskell-cafe] Typing question

Ketil Malde ketil+haskell at ii.uib.no
Tue Jan 11 05:40:41 EST 2005

Dmitri Pissarenko <mailing-lists at dapissarenko.com> writes:

> a) How should I define the types of the attributes correctly?

  data Purchase = P Double Double
  data Customer = C Int [Purchase]

or, if you want named fields:

  data Purchase = P { price, rebate :: Double }
  data Customer = C { id :: Int, purchases :: [Purchase] }

> b) Is it possible to impose a constraint on the "constructor" of
> tuple Purchase, so that the compiler throws an error, if one tries
> to create a purchase where rebate is greater than price (rebate and
> price are given in absolute numbers; rebate is NOT a fraction of
> price)?

One way would be to store it as a fraction, e.g. using an Int8 with
implicit 256 (or 255) denominator, which elminates the problem.  Or
create a function that constructs only valid Purchases, and hide the P
constructor (i.e. don't export it from the module). 

> c) What is a correct name for "attributes" of tuples (such as price
> and rebate in Purchase) and "constructors" of tuples?

I think the accepted lingo is "records with named fields". 

If I haven't seen further, it is by standing in the footprints of giants

More information about the Haskell-Cafe mailing list