simonmar at microsoft.com
Thu Jan 4 11:15:45 EST 2007
haskell-prime-bounces at haskell.org wrote:
> Simon Peyton-Jones <simonpj at microsoft.com> writes:
>>> My suggestion is that there should be a single default type
>>> per class.
>> Ah, I missed that.
> I suppose, because the proposed new rule is so simple and short, it is
> rather easy to miss its implications, especially if you are used to
> thinking in terms of the existing more complicated rule.
>> Suppose I have
>> default Eq Integer
>> default Fractional Float
>> and I have (Eq a, Fractional a). Does 'a' resolve to
> Integer or to Float? Perhaps a few examples on the proposal
> page would be useful for readers?
> The proposed rule is that defaulting applies *after* simplification of
> the context. So, although you initially infer
> (Eq a, Fractional a) => a
> but after simplification, this becomes
> (Fractional a) => a
> so there is a single class to be defaulted, and Float is chosen.
Is your proposal supposed to be backwards compatible with Haskell 98 for programs that don't have default declarations? If so, then I offer a counter example:
will default pi to Double in Haskell 98, but will be an error under your proposal, because the two constraints (Real and Floating) disagree on the default.
Warning: Defaulting the following constraint(s) to type `Double'
`Real a' arising from use of `toRational' at dflt.hs:3:7-19
`Floating a' arising from use of `pi' at dflt.hs:3:18-19
In the expression: toRational pi
In the definition of `test': test = toRational pi
You can generate more examples using Enum/Fractional combinations, but it's dubious whether Float & Double should be instances of Enum anyway.
More information about the Haskell-prime