<div>Hi all, I made a little extension that makes it a bit easier to work with Multiplate, there&#39;s a detailed explanation here:</div><div><a href="http://hackage.haskell.org/package/multiplate-simplified">http://hackage.haskell.org/package/multiplate-simplified</a></div>

<div><br></div><div>However, there&#39;s still some biolerplate that could be eliminated but I can&#39;t seem to do it nicely. When writing a Multiplate instance one has define a method called mkPlate:</div><div><br></div>

<div>mkPlate build = Plate (build pProg) (build pDecl) (build pExpr) (build pVar)</div><div><br></div><div>by using my package all arguments for Plate can be the same:</div><div><br></div><div>mkPlate build = Plate</div>
<div>
 (build $ getProjector undefined undefined)</div><div> (build $ getProjector undefined undefined)</div><div> (build $ getProjector undefined undefined)</div><div> (build $ getProjector undefined undefined)</div><div><br>
</div>
<div>but the following doesn&#39;t work:</div><div><br></div><div>withProj build = build $ getProjector undefined undefined</div><div><br></div><div>mkPlate build = Plate</div><div> (withProj build)</div><div> (withProj build)</div>

<div> (withProj build)</div><div> (withProj build)</div><div><br></div><div>neither does this one, though it gives a less scary error message:</div><div><br></div><div>mkPlate build = Plate withProj withProj withProj withProj</div>

<div> where</div><div>  withProj = build $ getProjector undefined undefined</div><div><br></div><div><br></div><div>All the code necessary to test this is included at the end of the source of the modules&#39;s hackage page.</div>

<div><br></div><div><br></div><div>Also, there&#39;s a probably similar issue if I define functions from Multiplate like this:</div><div><br></div><div><div>makeG funcFor = \ f a -&gt; funcFor (getProjector f a) f a</div>

<div>gtraverseFor  = makeG traverseFor</div></div><div><br></div>but this one works:<div><br>gtraverseFor :: (IsProjector p a) =&gt; p Identity -&gt; a -&gt; a<br>gtraverseFor f a = traverseFor (getProjector f a) f a<div>

<br></div><div><br></div><div><div class="gmail_quote">On Sat, Nov 20, 2010 at 04:45,  <span dir="ltr">&lt;<a href="mailto:roconnor@theorem.ca">roconnor@theorem.ca</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Multiplate is a lightweight generic library for mutually recursive data types that won&#39;t make Conor lose his lunch.<br>
<br>
Multiplate is an alternative extension of the Uniplate/Compos core design to support mutually recursive datatypes in a way that is as powerful as Compos, almost as easy to use as Uniplate, and more portable than both of them.<br>


<br>
Multiplate does not require you to rewrite your data type, does not require run-time reflection, does not require GADTs, and does not even require multi-parameter type classes. It only requires rank 3 polymorphism.<br>
<br>
&lt;<a href="http://hackage.haskell.org/package/multiplate-0.0.1" target="_blank">http://hackage.haskell.org/package/multiplate-0.0.1</a>&gt;<br>
<br>
A more detailed paper is forthcoming, but the library is available to try right now.<br>
<br>
-- <br>
Russell O&#39;Connor                                      &lt;<a href="http://r6.ca/" target="_blank">http://r6.ca/</a>&gt;<br>
``All talk about `theft,&#39;&#39;&#39; the general counsel of the American Graphophone<br>
Company wrote, ``is the merest claptrap, for there exists no property in<br>
ideas musical, literary or artistic, except as defined by statute.&#39;&#39;<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br></div></div>