Unpacking single-field, single-strict-constructor GADTs and existentials
david.feuer at gmail.com
Tue May 24 17:46:37 UTC 2016
Not really. It's really just the newtype optimization, although it's not a
On May 24, 2016 12:43 PM, "Ben Gamari" <ben at well-typed.com> wrote:
> David Feuer <david.feuer at gmail.com> writes:
> > Given
> > data Big a = B1 !(Small1 a) | B2 !(Small2 a) | B3 !(Small3 a), where the
> > Small types are (possibly recursive) sums, it's generally possible to
> > express that as something like
> > data Selector = One | Two | Three
> > data Big a = forall (x :: Selector) .
> > Big !(BigG x a)
> > data BigG x a where
> > GB1a :: some -> fields -> BigG 'One a
> > GB1b :: fields -> BigG 'One a
> > GB2a :: whatever -> BigG 'Two a
> > GB3a :: yeah -> BigG 'Three a
> > Making one big GADT from all the constructors of the "small" types, and
> > then wrapping it up in an existential. That's what I meant about
> > "unpacking". But for efficiency purposes, that wrapper needs the newtype
> > optimization.
> Yes, but you'd need to unbox a sum in this case, no? I think this is the
> first issue that you need to solve before you can talk about dealing
> with the polymorphism issue (although hopefully Ömer will make progress
> on this for 8.2).
> - Ben
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the ghc-devs