[Haskell-cafe] generalize RecordPuns and RecordWildCards to
work with qualified names?
Simon Peyton-Jones
simonpj at microsoft.com
Thu Aug 20 10:29:23 EDT 2009
Evan, Lennart
Thanks for the provocation. I've committed a patch that fixes all these issues. Try now!
Simon
Thu Aug 20 13:34:43 BST 2009 simonpj at microsoft.com
* Improvements to record puns, wildcards
* Make C { A.a } work with punning, expanding to C { A.a = a }
* Make it so that, with -fwarn-unused-matches,
f (C {..}) = x
does not complain about the bindings introduced by the "..".
* Make -XRecordWildCards implies -XDisambiguateRecordFields.
* Overall refactoring of RnPat, which had become very crufty.
In particular, there is now a monad, CpsRn, private to RnPat,
which deals with the cps-style plumbing. This is why so many
lines of RnPat have changed.
* Refactor the treatment of renaming of record fields into two passes
- rnHsRecFields1, used both for patterns and expressions,
which expands puns, wild-cards
- a local renamer in RnPat for fields in patterns
- a local renamer in RnExpr for fields in construction and update
This make it all MUCH easier to understand
* Improve documentation of record puns, wildcards, and disambiguation
| -----Original Message-----
| From: haskell-cafe-bounces at haskell.org [mailto:haskell-cafe-bounces at haskell.org] On
| Behalf Of Evan Laforge
| Sent: 12 August 2009 23:59
| To: Simon Peyton-Jones
| Cc: Augustsson, Lennart; haskell; GHC users
| Subject: Re: [Haskell-cafe] generalize RecordPuns and RecordWildCards to work with
| qualified names?
|
| > | Even is suggesting that instead of reporting an error, in the second
| > | case we could use the translation:
| > |
| > | f (A.A { A.a }) = a --> f (A.A { A.a = a })
| > |
| > | (i.e., when punning occurs with a qualified name, use just the
| > | unqualified part of the name in the pattern)
| >
| > Yes, that'd be possible. But it seems debatable -- it doesn't *look* as if the
| pattern (A.A { A.a }) binds 'a' -- and it seems even less desirable in record
| construction and update. To be concrete, would you expect these to work too?
| >
| > g a = A.A { A.a } --> g a = A.A { A.a = a }
| > h x a = x { A.a } --> h x a = a { A.a = a }
|
| Oh, I didn't realize that record punning included construction as
| well. Yeah, that's a little funky looking. I don't mind seeing the
| binding form and I think a new reader could figure it out without too
| much trouble but I would be a little confused by the construction form
| and think a new reader would also be confused.
|
| > With -XDisambiguateRecordFields you could say
| >
| > g a = A.A { a }
| >
| > which seems better. (But there's no help for record update, since we don't know
| which data constructor is involved.)
|
| I didn't know about DisambiguateRecordFields! Looks like that also
| makes the wildcard work like I want it to.
|
| The ghc docs for DisambiguateRecordFields don't make this very clear
| to me... it talks about disambiguating names in scope, but if I say
| "R.R { a = val}" I wouldn't expect it to "disambiguate" 'a', which is
| not in scope at all, to 'R.a' which looks like a completely different
| name. Rereading the paragraph at 7.3.11 I'm still surprised this
| works. Maybe add something like:
|
| ... preceeding docs ...
|
| This also means that if you use qualified imports you can still use
| unqualified field names. E.g. in the pattern @(R.R { a = a_val })@,
| @a@ will be disambiguated to @R.a@, even if @R@ is imported qualified.
|
| I gather we're not supposed to call them "records" anymore, they're
| supposed to be something I forget now, but the rest of the ghc docs
| says records, so...
|
| > So my current conclusion is: improve the error message, perhaps suggesting the
| flag -XDismabiguateRecordFields, but don't add the change you suggest.
| >
| > Comments?
|
| Sounds good to me. I'll try adding DisambiguateRecordFields and try
| out the new punning, thanks!
| _______________________________________________
| Haskell-Cafe mailing list
| Haskell-Cafe at haskell.org
| http://www.haskell.org/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list