To avoid actually realizing those boring fields in memory, use an unlifted newtype.

type VoidUnit# :: TYPE ('TupleRep '[])
newtype VoidUnit# = VoidUnit# VoidUnit#

absurd# :: VoidUnit# -> a
absurd# (VoidUnit# v) = absurd# v

Unfortunately, GHC's pattern checker isn't smart enough to see by itself that VoidUnit# is uninhabited, even though that's pretty obvious to a human.

TTG also has coercion problems thanks to the type families. *Sigh*

On Wed, Aug 31, 2022, 4:48 PM Olaf Klinke <olf@aatal-apotheke.de> wrote:
> Trees that grow is essentially this, but using type families.
>
>     data Foo ksi
>         = LeftFoo !(XLeftFoo ksi) !A
>         | RightFoo !(XRightFoo ksi) !B
>
>     type family XLeftFoo ksi :: Type
>     type family XRightFoo ksi :: Type
>
> Then you can define
>
>     data Both
>     type instance XLeftFoo  Both = ()
>     type instance XRightFoo Both = ()
>
> or
>
>     data OnlyLeft
>     type instance XLeftFoo  OnlyLeft = ()
>     type instance XRightFoo OnlyLeft = Void
>
> ---
>
> Third option is to simply have parametrized data:
>
>    data Foo b
>        = LeftFoo !A
>        | RIghtFoo !b
>
>    type FooBoth = Foo B
>    type FooOnlyLeft = Foo Void
>
> ---
>
> Sometimes I prefer a higher-kinded data approach, especially if there is
> very little variants needed, and they are "uniform" (e.g. second variant
> doesn't have some fields).
> Yet, sometimes simple parameterized data is simplest approach
> (especially as you get stuff for free by deriving Traversable!).
>
> On the other hand, if type is big and have many uniform extension points
> (even if there are few different combinations), then HKD becomes
> boilerplate heavy as well.
> The drawback of TTG, is that writing polymorphic code (i.e. which work
> for any or some `ksi`s) is not very fun: a lot of equality constraints etc.
>
> - Oleg

So I re-discovered Trees that Grow sans the trick of using type
families to name particular combinations of parameters. Hooray Najd,
and thanks Oleg for bringing this up.

Olaf

_______________________________________________
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.