[Haskell-cafe] Is there a handy refl or refl generator for converting GADT types?
chris done
haskell-cafe at chrisdone.com
Thu Jul 2 08:42:59 UTC 2020
One thing that does work nicely is record wild cards. I can write f X{..}=X{..}. So for a product type I’m pretty much set. I can also optionally manually update one or more fields if needed.
If there was an equivalent of record wild cards for sum types, that would be swell. E.g.
f = \case
X a -> ...
.. -> ..
To have GHC fill out the remainder constructors with a simple verbatim restating of “lhs -> lhs”. But it doesn't exactly match up with GHC's normal exhaustiveness checker which goes deeper than the top constructor.
It's fine, though, this doesn't happen _that_ often in my code.
Cheers,
Chris
On Sun, Jun 28, 2020, at 11:51 AM, Richard Eisenberg wrote:
> I think the general answer to your question is: no, you can't avoid this pattern match. In your particular case, the domain (Global Renamed) is a subset of the range (Global Generated), and so we can imagine a function that just changes the type without any fuss. This would, I'm pretty sure, be safe. But GHC has no notion of this kind of one-way transformation, so you're stuck just doing it via a manual pattern-match.
>
> I hope this helps!
> Richard
>
>> On Jun 27, 2020, at 3:23 PM, chris done <haskell-cafe at chrisdone.com> wrote:
>>
>> Hi all,
>>
>> I have stages in my compiler that convert e.g. Global Renamed -> Global Generated, etc. where certain constructors are available in certain stages.
>>
>> data GlobalRef s where
>> FromIntegerGlobal :: GlobalRef s
>> FromDecimalGlobal :: GlobalRef s
>> InstanceGlobal :: !InstanceName -> GlobalRef Resolved
>>
>> E.g. after type class resolution is done, the InstanceGlobal constructor is available. But instances can't appear in the AST at other stages.
>>
>> In three stages, I've had to copy/paste this code:
>>
>> + refl =
>> + case name of
>> + FromIntegerGlobal -> FromIntegerGlobal
>> + FromDecimalGlobal -> FromDecimalGlobal
>>
>> Because if I just put `name` then GHC will complain that the types are different, which is correct. But a straight-forward pattern match gives GHC the proof that they can be converted.
>>
>> Is there a handy way already implemented that could derive either this code or this proof for me?
>>
>> Cheers,
>>
>> Chris
>> _______________________________________________
>> Haskell-Cafe mailing list
>> To (un)subscribe, modify options or view archives go to:
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>> Only members subscribed via the mailman list are allowed to post.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20200702/7f3b1497/attachment.html>
More information about the Haskell-Cafe
mailing list