Forgot to mention — a good explanation of GHC Generics is the paper "A Generic Deriving Mechanism for Haskell".
Roman * Roman Cheplyaka <r...@ro-che.info> [2013-07-14 18:21:58+0300] > Hi, > > (Redirecting this back to cafe to keep it discoverable — hope you don't > mind.) > > * JP Moresmau <jpmores...@gmail.com> [2013-07-14 16:02:56+0200] > > Hello, sorry to bother you after you've been kind enough to answer me on > > the list! I've looked a the smallcheck code but I don't see how to apply it > > to my issue. First of all, I can't find the definition of >>- that you use > > for example in <~>. I suppose I'm doing something silly... > > That comes from LogicT. >>- is almost the same as >>=, and <~> is almost > the same as <*>. Byt that's not relevant to the generic aspect of the > code. > > > But then, if I understand the code, the instances for GSerial rebuild > > a type definition that mimicks the one passed as type argument, using > > the final values (under the K1s) to generate a series. But in my case, > > I want to be able to extract information from the original type, I'm > > not just interested in the final value. What I want to be able is to > > extract for example the constructor name and do something with it. I > > don't see how to achieve that with your system. > > Yes, it doesn't do everything that you want to do, but it shows the > idea. > > The information you need is all there — for example, to get the > constructor name, you need to get hold of the C1 type (which is a > synonym for M1 C), and then call the conName method. > > Lest you get lost in all this, it is useful to visualize the generic > representation by running your code through -ddump-deriv. Here's an > example: > > % ghci -XDeriveGeneric -ddump-deriv -dsuppress-module-prefixes > Prelude GHC.Generics> data T a = A { a :: a } | B | C deriving Generic > > ==================== Derived instances ==================== > Derived instances: > instance Generic (T a_ao7) where > from (A g1_aph) = M1 (L1 (M1 (M1 (K1 g1_aph)))) > from B = M1 (R1 (L1 (M1 U1))) > from C = M1 (R1 (R1 (M1 U1))) > to (M1 (L1 (M1 (M1 (K1 g1_api))))) = A g1_api > to (M1 (R1 (L1 (M1 U1)))) = B > to (M1 (R1 (R1 (M1 U1)))) = C > > instance Datatype D1T where > datatypeName _ = "T" > moduleName _ = ":Interactive" > > instance Constructor C1_0T where > conName _ = "A" > conIsRecord _ = True > > instance Constructor C1_1T where conName _ = "B" > > instance Constructor C1_2T where conName _ = "C" > > instance Selector S1_0_0T where selName _ = "a" > > > Generic representation: > > Generated datatypes for meta-information: > D1T > C1_0T > C1_1T > C1_2T > S1_0_0T > > Representation types: > type Rep (T a_ao7) = D1 > D1T > (C1 C1_0T (S1 S1_0_0T (Rec0 a_ao7)) > :+: (C1 C1_1T U1 :+: C1 C1_2T U1)) > > This should give you an idea about how the structure you're dealing with > looks like, and where the important information resides. > > > I've also look at Aeson with the generic JSON parsing, but that's > > using SYB which is again different, and SYB doesn't seem to provide > > the types of the constructor fields, which I would need too... > > It provides the types of the constructor fields through the Typeable > class, which may or may not be sufficient for your needs... Anyway, > you're right in that it is a completely different approach. > > Roman > > > On Fri, Jul 12, 2013 at 10:57 AM, Roman Cheplyaka <r...@ro-che.info> wrote: > > > > > Well, in your case, you need not 'from', but 'to', in order to convert > > > from a generic representation to yours. > > > > > > Take a look at how a similar task is done in SmallCheck: > > > > > > https://github.com/feuerbach/smallcheck/blob/master/Test/SmallCheck/Series.hs#L180 > > > > > > https://github.com/feuerbach/smallcheck/blob/master/Test/SmallCheck/Series.hs#L352 > > > > > > Roman > > > > > > * JP Moresmau <jpmores...@gmail.com> [2013-07-12 10:45:39+0200] > > > > Hello all, > > > > My problem is the following: I have my own data types, and I'd like to > > > > derive automatically instances of some type class from them. I've > > > > started > > > > looking at GHC.Generics, which offer tools to do exactly that. However, > > > > some functions of my typeclass do not take my data type as a parameter, > > > but > > > > as a result. Basically: > > > > class MyClass where > > > > fromString :: String -> a > > > > > > > > data MyData=MkMyData { > > > > myField ::Int > > > > } deriving (Generic) > > > > > > > > and I want to automatically generate the instance instance MyClass > > > MyData, > > > > using default methods, etc. > > > > The GHC Generic class does say that it uses a from function that convert > > > > from the datatype to its representation: from :: a -> > > > > Rep< > > > http://www.haskell.org/ghc/docs/7.4.1/html/libraries/ghc-prim-0.2.0.0/GHC-Generics.html#t:Rep > > > > > > > > a > > > > xfrom :: a -> Rep< > > > http://www.haskell.org/ghc/docs/7.4.1/html/libraries/ghc-prim-0.2.0.0/GHC-Generics.html#t:Rep > > > > > > > > a > > > > x > > > > But I don't have a "a" to start from! I see from the related papers that > > > > the automatically generated code from from actually does pattern matches > > > on > > > > constructors, so I need a value, undefined won't work. However I see the > > > > GHC.Generics also provide :+: (Sums: encode choice between > > > > constructors). > > > > If I have to provide an value, then the choice between constructor has > > > been > > > > done! The examples about generics on > > > > http://www.haskell.org/haskellwiki/GHC.Generics do provide an example of > > > > defining the instance for :+: but I don't understand how we can get > > > there. > > > > If I have a class method that takes a value as a parameter, and I pass > > > > undefined to it, the code will crash, since it can't pattern match on > > > > undefined. > > > > > > > > Can somebody shed some light on this? Am I using the wrong tool for the > > > > job? How can I achieve what I want? I want the full type representation > > > > with sums, but without a value to start from. > > > > > > > > Thanks a million! > > > > > > > > JP > > > > -- > > > > JP Moresmau > > > > http://jpmoresmau.blogspot.com/ > > > > > > > _______________________________________________ > > > > Haskell-Cafe mailing list > > > > Haskell-Cafe@haskell.org > > > > http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > > > > > > > > > -- > > JP Moresmau > > http://jpmoresmau.blogspot.com/ _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe