<p dir="ltr">I don't know much about this database stuff, but I'm pretty sure you want to *build* the selector, rather than *extracting* it. You should use the Generics metadata to get the string for parsing/printing, but aside from that, you just have the products.</p>
<div class="gmail_extra"><br><div class="gmail_quote">On Nov 23, 2016 10:19 PM, "Chris Kahn" <<a href="mailto:chris@kahn.pro">chris@kahn.pro</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Aaaand you'll get mine twice since I forgot to reply-all the first time :)<br>
<div class="quoted-text"><br>
Sure, so in postgresql-simple there are two classes for automatically<br>
generating functions that encode/decode database rows, `FromRow` and<br>
`ToRow`. In the Hasql library--another postgres library--the encoders<br>
and decoders must be written by hand for each user-defined type. I want<br>
to write a class that will automatically generate these.<br>
<br>
I successfully wrote a `FromRow` class that can generate Hasql's `Row`<br>
type, since it's basically identical to what's in postgresql-simple's<br>
`FromRow`. But in Hasql the encoder type, Params, is contravariant and<br>
encoders are defined like:<br>
<br>
    personEncoder :: Params Person<br>
    personEncoder = contramap name (value text) <><br>
                    contramap age (value int)<br>
<br>
The `value text` part can be determined based on the type information,<br>
but it's also expecting a matching selector function. I'm at a total<br>
loss for how I could generate something like this.<br>
<br>
<br>
<br>
</div><div class="elided-text">On 11/23/2016 10:06 PM, David Feuer wrote:<br>
> Sorry if anyone gets this twice; the first copy somehow went to a<br>
> non-existent Google Groups version of haskell-cafe.<br>
><br>
> GHC.Generics doesn't offer any built-in support for such things. It<br>
> *looks* like there *might* be some support in packages built around<br>
> generics-sop. When you're working directly with GHC.Generics, the<br>
> notion of a record barely even makes sense. A record is seen as simply<br>
> a possibly-nested product. For example, ('a','b','c') will look<br>
> *approximately* like 'a' :*: ('b'  :*: 'c'). You're generally not<br>
> "supposed" to care how large a record you may be dealing with, let<br>
> alone what field names it has. May I ask what you're actually trying<br>
> to do? Your specific request sounds peculiarly un-generic.<br>
><br>
> On Wed, Nov 23, 2016 at 9:52 PM,  <<a href="mailto:chris@kahn.pro">chris@kahn.pro</a>> wrote:<br>
>> Hey all!<br>
>><br>
>> I'm trying to understand what's going on in GHC.Generics and defining a<br>
>> generic class... I understand that there's a `Selector` class and `selName`<br>
>> function that can get the name of a selector, but is there a way to access<br>
>> the selector function itself? The documentation conveniently avoids examples<br>
>> involving records and is otherwise quite barren.<br>
>><br>
>> So if I have a data type like...<br>
>><br>
>> data Person = Person<br>
>>     { name :: String<br>
>>     , age :: Int<br>
>>     } deriving Generic<br>
>><br>
>> instance MyTypeClass Person<br>
>><br>
>> I want my generic implementation of MyTypeClass to be able to access each<br>
>> selector function in the record, f :: Person -> String, g :: Person -> Int,<br>
>> etc.<br>
>><br>
>> Chris<br>
>><br>
>> ______________________________<wbr>_________________<br>
>> Haskell-Cafe mailing list<br>
>> To (un)subscribe, modify options or view archives go to:<br>
>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
>> Only members subscribed via the mailman list are allowed to post.<br>
</div></blockquote></div><br></div>