Associativity of the generic representation of sum types

Bas van Dijk v.dijk.bas at gmail.com
Thu Sep 22 19:31:39 CEST 2011


2011/9/22 Bas van Dijk <v.dijk.bas at gmail.com>:
> I just discovered the predicate:
>
>  -- | Marks if this constructor is a record
>  conIsRecord :: t c (f :: * -> *) a -> Bool
>
> I think this can solve my problem.

I think I have solved the bug now using conIsRecord. This is the new
implementation:

https://github.com/basvandijk/aeson/blob/newGenerics/Data/Aeson/Types/Internal.hs#L889

However, I would still very much like to have the information, whether
a constructor is a record or not, statically available. This has two
advantages:

* More efficient: programs can make a static instead of a dynamic choice.

* No more ugly undefined instances: because the information is not
statically available I need to add several "undefined" instances like:

instance GFromRecord (a :+: b)  where gParseRecord = undefined
instance GFromRecord U1         where gParseRecord = undefined
instance GFromRecord (K1 i c)   where gParseRecord = undefined
instance GFromRecord (M1 i c f) where gParseRecord = undefined

These instances will never be evaluated at runtime. They only exist to
satisfy the type-checker.

So I propose making the following changes to GHC.Generics:

Add a phantom type to C that specifies whether it's a record or not
using the (empty) datatypes:

data Record
data Product

Maybe it's also nice to have the type synonyms:

type R1 = M1 (C Record)
type P1 = M1 (C Product)

I will make an official ticket for this.

Regards,

Bas



More information about the Glasgow-haskell-users mailing list