<div dir="ltr">I think consistency with the rest of the Map API is more important than ease of use with lens/nested compositions.  I agree that the current arg ordering is often inconvenient, but having some functions ordered one way and others a different way seems a very poor decision.<div>
<br></div><div>John L.<br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 19, 2013 at 9:14 PM, Edward A Kmett <span dir="ltr">&lt;<a href="mailto:ekmett@gmail.com" target="_blank">ekmett@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Flipping to lambda -&gt; key means that you cannot compose these for nested lookups.<br>
<br>
alterF in its current form is a valid lens.<br>
<br>
A very common idiom from the lens community is to do lookups in nested maps with the equivalent of:<br>
<br>
alterF key1 . traverse . alterF key2<br>
<br>
There is a similar idiom for doing inserts into nested maps as well.<br>
<br>
Flipping it means any composition of alterF incurs lots of flips.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Edward<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Jun 19, 2013, at 8:27 AM, Milan Straka &lt;<a href="mailto:fox@ucw.cz">fox@ucw.cz</a>&gt; wrote:<br>
<br>
&gt; Hi all,<br>
&gt;<br>
&gt;&gt; -----Original message-----<br>
&gt;&gt; From: Nikita Volkov &lt;<a href="mailto:nikita.y.volkov@gmail.com">nikita.y.volkov@gmail.com</a>&gt;<br>
&gt;&gt; Sent: 19 Jun 2013, 13:47<br>
&gt;&gt;<br>
&gt;&gt; Hello guys!<br>
&gt;&gt;<br>
&gt;&gt; A deadline of a discusssion on this has been reached. To review the discussion you can visit the archives. Following is a summarization.<br>
&gt;&gt;<br>
&gt;&gt; 1. Following is an implementation proposed by Schachaf Ben-Kiki, which in a combination with an `INLINABLE` pragma produces very impressive results by making even the primitive operations reimplemented in terms of it perform better:<br>

&gt;&gt;<br>
&gt;&gt; insert: ~ +5% increase using alterF<br>
&gt;&gt; delete: ~ +10% increase using alterF<br>
&gt;<br>
&gt; I probably did not make myself clear enough -- the insert reimplemented<br>
&gt; with alterF runs 5% slower (the running time is increased by 5%) and<br>
&gt; similarly for delete.<br>
&gt;<br>
&gt;&gt;   alterF :: (Ord k, Functor f) =&gt; k -&gt; (Maybe a -&gt; f (Maybe a)) -&gt; Map k a -&gt; f (Map k a)<br>
&gt;&gt;   STRICT_1_OF_2(alterF)<br>
&gt;&gt;   alterF k f = go<br>
&gt;&gt;     where<br>
&gt;&gt;       go Tip = maybe Tip (singleton k) &lt;$&gt; f Nothing<br>
&gt;&gt;       go (Bin sx kx x l r) =<br>
&gt;&gt;         case compare k kx of<br>
&gt;&gt;           LT -&gt; (\l&#39; -&gt; balance kx x l&#39; r) &lt;$&gt; go l<br>
&gt;&gt;           GT -&gt; (\r&#39; -&gt; balance kx x l r&#39;) &lt;$&gt; go r<br>
&gt;&gt;           EQ -&gt; maybe (glue l r) (\x&#39; -&gt; Bin sx kx x&#39; l r) &lt;$&gt; f (Just x)<br>
&gt;&gt;<br>
&gt;&gt; 2. `alterF` seems to be a mutually accepted title for the function<br>
&gt;&gt;<br>
&gt;&gt; 3. There was one downvote for implementing `alterF` with a changed order of parameters to &quot;key -&gt; lambda&quot;, as compared to &quot;lambda -&gt; key&quot; of other modification functions in the library. Others seemed to be neutral about it. The implementation above is in that changed order. After some thinking my vote can be counted as a downvote too on that.<br>

&gt;<br>
&gt; Looking at alterF, I think we should be consistent with the rest of the<br>
&gt; API and use lambda -&gt; key.<br>
&gt;<br>
&gt;<br>
&gt; Cheers,<br>
&gt; Milan<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Libraries mailing list<br>
&gt; <a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/libraries" target="_blank">http://www.haskell.org/mailman/listinfo/libraries</a><br>
<br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/libraries" target="_blank">http://www.haskell.org/mailman/listinfo/libraries</a><br>
</div></div></blockquote></div><br></div></div></div>