Partial type sigs
Simon Peyton Jones
simonpj at microsoft.com
Thu Feb 5 21:30:10 UTC 2015
Oh gosh you are absolutely right. Ordinary, lexically scoped type variables only scope over the RHS of the relevant binding, not the body of the let. I was completely wrong about that.
In which case my objection is much milder:
 the inconsistency of treatment wrt ordinary type variables
(which require a forall; and yes, you can't give a forall for wildcards)
 the lack of documentation
The system would be simpler without this. So, is it really important? If so, we could add it later.
Sorry to make such a misleading post.
Simon
 Original Message
 From: dominique.devriese at gmail.com [mailto:dominique.devriese at gmail.com]
 On Behalf Of Dominique Devriese
 Sent: 05 February 2015 20:13
 To: Simon Peyton Jones
 Cc: Thomas Winant; ghcdevs at haskell.org; Frank Piessens
 Subject: Re: Partial type sigs

 Simon,

 20150205 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 ghcdevs
mailing list