[ghc-steering-committee] [Proposal] #175: Lift.liftTyped (recommendation: accept)
Eric Seidel
eric at seidel.io
Mon Nov 5 20:26:49 UTC 2018
Though on second thought, this still doesn’t exactly provide a clean migration path.
If I depend on version X of some library that uses the default implementation of lift, and I upgrade to a new GHC with the new Lift class, version X of my dependency will continue to compile, albeit with a warning. But I probably don’t pay much attention to warnings in my dependencies (and almost certainly don’t compile them with -Werror), so I may still be caught off-guard by the change.
Sent from my iPhone
> On Nov 5, 2018, at 12:51, Eric Seidel <eric at seidel.io> wrote:
>
>> On Mon, Nov 5, 2018, at 13:50, Richard Eisenberg wrote:
>> Will this break existing code? The proposal suggests that liftTyped will
>> have a suitable default implementation.
>>
>> Actually, this will break code, but not in the way one might think (with
>> an undefined liftTyped). Instead, the proposal removes the default
>> implementation of lift to use liftTyped. This means that any code
>> relying on the default implementation of lift will now have an instance
>> with mutually recursive, non-terminating methods. And this will all be
>> silent. And, it's something that might be discovered only in clients of
>> a library, rather than in the library itself. So I think that's pretty
>> problematic. Even with our recommendation to derive Lift instances, this
>> change in behavior is so terrible that it makes me lean against the
>> proposal. Is there a design / migration path that avoids this problem?
>
> The current iteration of the proposal has a MINIMAL pragma on Lift, specifying that either lift or liftTyped must be explicitly implemented.
>
> https://github.com/harpocrates/ghc-proposals/blob/lift-typed/proposals/0000-lift-typed.rst#2proposed-change-specification
>
> So code that currently relies on the default implementation of lift will indeed break, but not silently! The library author will get a warning that they need to provide lift or liftTyped (or, preferably, switch to DeriveLift).
More information about the ghc-steering-committee
mailing list