[Haskell-cafe] Is generic information dumpable?

Bas van Dijk v.dijk.bas at gmail.com
Fri Nov 4 11:31:30 CET 2011


Thanks José!

Will this make it into ghc-7.4?

Bas

2011/11/4 José Pedro Magalhães <jpm at cs.uu.nl>:
> Hi,
> Now, for the following datatype:
> data X a = X { myX :: a } deriving Generic
> You get the following -ddump-deriv output:
> ==================== Derived instances ====================
> Derived instances:
>   instance GHC.Generics.Generic (Temp.X a_adY) where
>     GHC.Generics.from (Temp.X g1_aeG)
>       = GHC.Generics.M1
>           (GHC.Generics.M1 (GHC.Generics.M1 (GHC.Generics.K1 g1_aeG)))
>     GHC.Generics.to
>       (GHC.Generics.M1 (GHC.Generics.M1 (GHC.Generics.M1 (GHC.Generics.K1
> g1_aeH))))
>       = Temp.X g1_aeH
>
>   instance GHC.Generics.Datatype Temp.D1X where
>     GHC.Generics.datatypeName _ = "X"
>     GHC.Generics.moduleName _ = "Temp"
>
>   instance GHC.Generics.Constructor Temp.C1_0X where
>     GHC.Generics.conName _ = "X"
>     GHC.Generics.conIsRecord _ = GHC.Types.True
>
>   instance GHC.Generics.Selector Temp.S1_0_0X where
>     GHC.Generics.selName _ = "myX"
>
> Generic representation:
>
>   Generated datatypes for meta-information:
>     Temp.D1X
>     Temp.C1_0X
>     Temp.S1_0_0X
>
>   Representation types:
>     Temp.Rep_X = GHC.Generics.D1
>                    Temp.D1X
>                    (GHC.Generics.C1
>                       Temp.C1_0X
>                       (GHC.Generics.S1 Temp.S1_0_0X (GHC.Generics.Par0
> a_adY)))
> Still not perfect, in that the representation type should really appear as a
> type instance inside the Generic instance, but at least all the important
> information is printed.
>
> Cheers,
> Pedro
>
> 2011/11/3 Bas van Dijk <v.dijk.bas at gmail.com>
>>
>> 2011/11/3 José Pedro Magalhães <jpm at cs.uu.nl>:
>> > "-ddump-deriv" will print (most of) it.
>>
>> But it doesn't print the most useful piece of information: the
>> definition of Rep.
>>
>> It would be great if this could be added.
>>
>> Currently when I have a type that I want to know the Rep of, say:
>>
>> data Foo = Bar Int
>>         | Boo {hello :: String}
>>           deriving Generic
>>
>> I just convert it to a Rep and show it:
>>
>> err = show $ from $ Boo "World"
>>
>> However Reps don't have Show instances so GHC complains:
>>
>> No instance for
>>  (Show (D1 D1Foo (   C1 C1_0Foo (S1 NoSelector (Rec0 Int))
>>                  :+: C1 C1_1Foo (S1 S1_1_0Foo (Rec0 String))
>>                  )
>>         x0
>>        )
>>  )
>>  arising from a use of `show'
>>
>> And there you go. This is the only time when I'm happy to see an error
>> message :-)
>>
>> Bas
>
>



More information about the Haskell-Cafe mailing list