Partial type sigs
Dominique Devriese
dominique.devriese at cs.kuleuven.be
Thu Feb 5 20:12:34 UTC 2015
Simon,
2015-02-05 17:44 GMT+01:00 Simon Peyton Jones <simonpj at microsoft.com>:
> 3. It interferes with generalisation.
>
> For (3), consider
>
> let f :: _a -> _a
>
> f xs = reverse xs
>
> in (f True, f ‘x’)
>
> Here, f gets the type f :: forall b. [b] -> [b], and _a is unifed with [b].
>
> So it simply doesn’t make sense for _a to appear in the body. What would it
> mean to say
>
> let f :: _a -> _a
>
> f xs = reverse xs
>
> in (f (True :: _a), f ‘x’)
Isn't this a different case than Thomas' example? As I understand it,
an equivalent of his example would have the wildcard in scope in the
body of f, not in the body of the let. Something like this:
let f :: _a -> _a
f xs = reverse (xs :: _a)
in (f [True], f "x")
or
let f :: _a -> _a
f xs = let ys :: _a
ys = tail xs
in reverse ys
in (f [True], f "x")
I agree with what you say about _a being in scope in the body of the
if, but I don't see a problem with _a being in scope in the body of f.
Do you?
Note also that I haven't yet checked which of both is actually implemented.
Regards,
Dominique
More information about the ghc-devs
mailing list