GHC support for the new "record" package

Iavor Diatchki iavor.diatchki at gmail.com
Fri Jan 23 19:30:20 UTC 2015


Hello,

I just read through Adam's proposal and here is my take:

1. I like the general idea---in particular:
  - backwards compatibility is very important to me as I make extensive use
of records in all my code,
  - for me, anonymous records are fairly low priority

2. I would propose that we simplify things further, and provide just one
class for overloading:

class Field (name :: Symbol)
            rec   rec'
            field field'
  | name rec         -> field
  , name rec'        -> field'
  , name rec  field' -> rec'
  , name rec' field  -> rec
  where
  field :: Functor f => Proxy name -> (field -> f field') ->
                                      (rec   -> f rec')

I don't think we need to go into "lenses" at all, the `field` method simply
provides a functorial
update function similar to `mapM`.   Of course, one could use the `lens`
library to
get more functionality but this is entirely up to the programmer.

When the ORF extension is enabled, GHC should simply generate an instance
of the class,
in a similar way to what the lens library does.

3. I like the idea of `#x` desugaring into `field (Proxy :: Proxy "x")`,
but I don't like the concrete symbol choice:
  - # is a valid operator and a bunch of libraries use it, so it won't be
compatible with existing code.

  - @x might be a better choice; then you could write things like:
    view @x      rec
  set  @x 3    rec
  over @x (+2) rec

  - another nice idea (due to Eric Mertens, aka glguy), which allows us to
avoid additional special syntax is as follows:
    - instead of using special syntax, reuse the module system
    - designate a "magic" module name (e.g., GHC.Records)
    - when the renamer sees a name imported from that module, it "resolves"
the name by desugaring it into whatever we want
    - For example, if `GHC.Records.x` desugars into `field (Proxy :: Proxy
"x")`, we could write things like this:

import GHC.Records as R

view R.x      rec
set  R.x 3    rec
over R.x (+2) rec


-Iavor































On Fri, Jan 23, 2015 at 2:25 AM, Adam Gundry <adam at well-typed.com> wrote:

> On 23/01/15 10:17, Simon Marlow wrote:
> > On 23/01/2015 04:12, Johan Tibell wrote:
> >>
> >>
> >> On Wed, Jan 21, 2015 at 5:48 PM, Simon Marlow <marlowsd at gmail.com
> >> <mailto:marlowsd at gmail.com>> wrote:
> >>
> >>     On 21/01/2015 16:01, Johan Tibell wrote:
> >>
> >>         My thoughts mostly mirror those of Adam and Edward.
> >>
> >>         1) I want something that is backwards compatible.
> >>
> >>
> >>     Backwards compatible in what sense?  Extension flags provide
> >>     backwards compatibility, because you just don't turn on the
> >>     extension until you want to use it.  That's how all the other
> >>     extensions work; most of them change syntax in some way or other
> >>     that breaks existing code.
> >>
> >>
> >> In this case in the sense of avoiding splitting code into a new-Haskell
> >> vs old-Haskell. This means that existing records should work well (and
> >> ideally also get the improved name resolution when used in call sites
> >> that have the pragma enabled) in the new record system.
> >
> > I understand that position, but it does impose some pretty big
> > constraints, which may mean the design has to make some compromises.
> > It's probably not worth discussing this tradeoff until there's actually
> > a concrete proposal so that we can quantify how much old code would fail
> > to compile and the cost of any compromises.
>
> In this spirit, I've started to prepare a concrete proposal for a
> revised OverloadedRecordFields design, based on recent feedback:
>
>
> https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/Redesign
>
> This would not necessarily include anonymous records at first, but they
> do fit nicely as a potential later extension, and it would work well
> with a slightly amended version of the record library in the meantime.
> I'd be very interested to hear what you think of this.
>
> Also, if someone would be prepared to flesh out a proposal based on the
> anonymous records idea, that might be a useful point of comparison.
>
> Adam
>
> --
> Adam Gundry, Haskell Consultant
> Well-Typed LLP, http://www.well-typed.com/
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://www.haskell.org/mailman/listinfo/ghc-devs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/ghc-devs/attachments/20150123/957fa144/attachment.html>


More information about the ghc-devs mailing list