<p dir="ltr">I was thinking switching to CPS might help, passing the context down on the way to the leaf, so the tree is built "inside" the functor. This is pretty easy for nodes and digits, but I'm struggling with the polymorphic recursion in the spine right now. I think I'll probably figure it out eventually.</p>
<div class="gmail_quote">On Apr 27, 2016 6:12 PM, "Edward Kmett" <<a href="mailto:ekmett@gmail.com">ekmett@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">For cases were the Functor winds up particularly complicated or won't<br>
be known at compile time so the inlining can't help, it turns out you<br>
can usually work around this with the 'fusing' combinator from the<br>
lens library. This works around the repeated stacks of `fmap` that get<br>
built up otherwise, transforming everything into one gigantic fmap all<br>
in one go.<br>
<br>
There is a similar `confusing` combinator for working with traversals.<br>
The implementation lives up to the name.<br>
<br>
-Edward<br>
<br>
On Wed, Apr 27, 2016 at 5:19 PM,  <<a href="mailto:rf@rufflewind.com">rf@rufflewind.com</a>> wrote:<br>
> On Tue, Apr 26, 2016, at 15:03, David Feuer wrote:<br>
>> Way back when, Shachaf Ben-Kiki suggested an efficient implementation<br>
>> of `at` for Data.Map in<br>
>> <a href="https://mail.haskell.org/pipermail/libraries/2013-May/019761.html" rel="noreferrer" target="_blank">https://mail.haskell.org/pipermail/libraries/2013-May/019761.html</a> but<br>
>> that was never approved for inclusion.<br>
><br>
> Funny thing, I just tried doing that not to long ago with `at`:<br>
><br>
> <a href="https://github.com/haskell/containers/pull/192" rel="noreferrer" target="_blank">https://github.com/haskell/containers/pull/192</a><br>
><br>
> In the end, the results were mixed.  It was a small optimization in some<br>
> situations, and a moderate pessimization in others (esp. when the<br>
> Functor becomes too complex for GHC to optimize).<br>
><br>
> --<br>
> RF<br>
> _______________________________________________<br>
> Libraries mailing list<br>
> <a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>