GHC support for the new "record" package

Simon Peyton Jones simonpj at microsoft.com
Tue Jan 27 09:16:16 UTC 2015


Adam, are you willing to update the wiki page to reflect the latest state of the conversation, identifying remaining choices? That would be v helpful.

Simon

|  -----Original Message-----
|  From: Adam Gundry [mailto:adam at well-typed.com]
|  Sent: 27 January 2015 09:07
|  To: Edward Kmett; Simon Peyton Jones
|  Cc: Simon Marlow; ghc-devs at haskell.org
|  Subject: Re: GHC support for the new "record" package
|  
|  Yes, we can't make IV the magic class for which instances are
|  generated.
|  As I pointed out earlier in the thread, we need to give an instance
|  for the function space that enforces the functional dependency (either
|  with an actual fundep or a type family), and keep a distinguished
|  HasField class. AFAICS it's still an open question as to whether that
|  instance should provide
|  
|  (a) selector functions r -> a
|  (b) lenses (a -> f b) -> s -> f t
|  (c) both
|  (d) neither
|  
|  but I'm starting to think (b) is the sanest option.
|  
|  Otherwise, I think we've more or less converged on the issues (apart
|  from the syntax question) and I'll update the wiki page appropriately.
|  
|  On the syntax question, Edward, could you say more about how you would
|  expect the magic imports to work? If a module both declares (or
|  imports) a record field `x` and magically imports `x`, what does a use
|  of `x` mean? (In the original ORF, we didn't have the magic module,
|  but just said that record fields were automatically polymorphic...
|  that works but is a bit fiddly in the renamer, and isn't a
|  conservative extension.)
|  
|  Adam
|  
|  
|  On 27/01/15 00:59, Edward Kmett wrote:
|  > I'm also rather worried, looking over the IV proposal, that it just
|  > doesn't actually work.
|  >
|  > We actually tried the code under "Haskell 98 records" back when
|  Gundry
|  > first started his proposal and it fell apart when you went to
|  compose them.
|  >
|  > A fundep/class associated type in the class is a stronger constraint
|  > that a type equality defined on an individual instance.
|  >
|  > I don't see how
|  >
|  > @foo . @bar . @baz
|  >
|  > (or #foo . #bar . #baz as would be written under the concrete
|  proposal
|  > on the wiki)
|  >
|  > is ever supposed to figure out the intermediate types when working
|  > polymorphically in the data type involved.
|  >
|  > What happens when the type of that chain of accessors is left to
|  > inference? You get stuck wallowing in AllowAmbiguousTypes territory:
|  >
|  > (#foo . #bar . #baz) :: (IV "foo" (c -> d), IV "bar" (b -> c), IV
|  "baz"
|  > (a -> b)) => a -> d
|  >
|  > has a variables 'b' and 'c' that don't occur on the right hand side,
|  > and which are only determinable by knowing that the instances you
|  > expect to see look something like:
|  >
|  > instance (a ~ Bool) => IV "x" (S -> a) where
|  >   iv (MkS x) = x
|  >
|  > but that is too weak to figure out that "S" determines "a" unless S
|  is
|  > already known, even if we just limit ourselves to field accessors as
|  > functions.
|  >
|  > -Edward
|  
|  
|  --
|  Adam Gundry, Haskell Consultant
|  Well-Typed LLP, http://www.well-typed.com/


More information about the ghc-devs mailing list