GHC support for the new "record" package

Adam Gundry adam at well-typed.com
Fri Jan 23 08:59:34 UTC 2015


On 22/01/15 21:07, Edward Kmett wrote:
> On Thu, Jan 22, 2015 at 4:31 AM, Adam Gundry <adam at well-typed.com
> <mailto:adam at well-typed.com>> wrote:
> 
>     Actually, the simplifications I recently came up with could allow us to
>     make uses of the field work as van Laarhoven lenses, other lenses *and*
>     selector functions. In practice, however, I suspect this might lead to
>     somewhat confusing error messages, so it might not be desirable.
> 
> 
> Interesting. Have you actually tried this with a composition of your
> simplified form, because I don't see how that can work.
> 
> When we tried this before we showed that there was a fundamental
> limitation in the way the functional dependencies had to flow
> information down the chain, also, "foo.bar.baz" has very different
> interpretations, between the lens and normal accessors, and both are
> producing functions, so its hard to see how this doesn't yield
> overlapping instance hell.

Apparently, composition works fine with both interpretations. Have a
look here:

https://github.com/adamgundry/records-prototype/blob/master/CoherentPrototype.hs#L274-279
https://github.com/adamgundry/records-prototype/blob/master/CoherentPrototype.hs#L75-90

The key idea is to define

    class IsRecordField (n :: Symbol) p where
      field :: proxy n -> p

as the interpretation of fields, and notice that the two instances we want

    IsRecordField n (r          -> t        )
    IsRecordField n ((a -> f b) -> (s -> f t)

do not "morally" overlap, because in the first case r will always be a
record datatype, and in the second case it is a function.  Thus we can
distinguish them using a closed type family.

However, now that I look back, I notice that I'm using a suspicious
functional dependency that doesn't look as if it should satisfy the
liberal coverage condition, even though it is accepted by 7.8.3. So
perhaps I'm too optimistic; and in any case, the types involved may be
too confusing for use in practice.

Adam


-- 
Adam Gundry, Haskell Consultant
Well-Typed LLP, http://www.well-typed.com/


More information about the ghc-devs mailing list