
Dmitri Pissarenko
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". -kzm -- If I haven't seen further, it is by standing in the footprints of giants