[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