CC: Functional dependencies question
Andrew J Bromage
ajb@spamcop.net
Tue, 13 May 2003 14:24:55 +1000
G'day.
On Mon, May 12, 2003 at 08:55:55PM -0700, oleg@pobox.com wrote:
> 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)
That works, but IMO it's a bit unwieldy. It also doesn't help with
actually defining a reasonable type signature for hbar which is the
point of the exercise.
>From an engineering perspective, there's little point having these
expressive types if the user can't easily insert type declarations
for them. I want to know where the error is, not where the error
first causes a problem. To do that, I want to litter my code with
as many type assertions as I can (without sacrificing readability, of
course) so that the compiler can point out to me precisely where my
reasoning went wrong. The equivalent of "there's a type error
somewhere in this module" is not very helpful.
Incidentally, the Neg functor isn't such a bad idea, either, but I
used the pair for historical reasons more than anything else. I
originally thought you could save some compile time by working in
non-unique whole numbers then normalising when you need a concrete
type, but this reasoning turned out to be bogus.
Cheers,
Andrew Bromage