Hello,<br><br><div class="gmail_quote">On Thu, Aug 20, 2009 at 16:54, Max Desyatov <span dir="ltr">&lt;<a href="mailto:explicitcall@googlemail.com" target="_blank">explicitcall@googlemail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">



<div>Sean Leather &lt;<a href="mailto:leather@cs.uu.nl" target="_blank">leather@cs.uu.nl</a>&gt; writes:<br>
<br>
&gt; I&#39;m not sure the problem you&#39;re running into is strictly a generic<br>
&gt; programming (GP) one. Typically, GP takes code that is often written<br>
&gt; and generalizes it, so that it doesn&#39;t have to be written for multiple<br>
&gt; datatypes.<br>
<br>
</div>That seems to be GP problem, as your solution doesn&#39;t scale well when I<br>
wan&#39;t to add/remove/change fields in the `Row` record.  The perfect way<br>
as I see it, would be just editing `Row` data declaration, nothing else.<br>
Studying few papers about GP in Haskell, I reckon this could be<br>
represented as generic traversal, using my `Row` declaration with<br>
`Either`.  I don&#39;t see really good way to write a generic producer from<br>
`[String]` to version of `Row` without `Either`.  But SYB doesn&#39;t<br>
provide a way for passing type-class-parametric functions to gmapT, and<br>
SYB-with-class has large overhead of its usage.  I don&#39;t have enough<br>
time to find out how this can be written in SYB-with-class, if it really can be<br>
written.  The restriction of EMGM was described in my initial message.</blockquote><div><br>Indeed SYB doesn&#39;t work here because Typeable-based run-time type comparison only works for monomorphic types. Doing something like<br>



<br><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">readRow l = gmapT (mkT (\(Left (Just ri) :: E Name) -&gt; Right $ l `atMay` ri &gt;&gt;= readMay))<br>


</blockquote><br>would work, but this, of course, is not what you want. I&#39;m guessing the polymorphic typeOf previously described by Oleg [1] could help here, were it integrated in SYB.<br><br>I don&#39;t think syb-with-class will help you here, since it only adds modularity to the type-based function extension. I think you would still have to write a case for every field in the Row record.<br>


<br>Multirec would possibly work, were it not for the fact that it doesn&#39;t support parametric datatypes yet...<br><br><br>Cheers,<br>Pedro<br><br>[1] <a href="http://osdir.com/ml/haskell-cafe@haskell.org/2009-03/msg00212.html" target="_blank">http://osdir.com/ml/haskell-cafe@haskell.org/2009-03/msg00212.html</a><br>


</div></div><br>