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; ghc-devs at haskell.org; Frank Piessens
| Subject: Re: Partial type sigs
| 
| 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