<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Oct 15, 2013 at 8:51 AM, Allen Wirfs-Brock <span dir="ltr"><<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><div class="im"><div>On Oct 15, 2013, at 6:40 AM, Mark S. Miller wrote:</div>
<br><blockquote type="cite"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Oct 15, 2013 at 3:39 AM, Andreas Rossberg <span dir="ltr"><<a href="mailto:rossberg@google.com" target="_blank">rossberg@google.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>On 15 October 2013 03:09, Allen Wirfs-Brock <<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>> wrote:<br>


> I still don't get why so many JS programmer with a FP orientation want  to do things with the |this| binding.   |this| is for us OO geeks, if you are doing FP you don't need it.<br>
<br>
</div>Well, 'this' comes up because you cannot avoid having to interface<br>
with OOish APIs that conflicts with FPish composition patterns. For<br>
example, you'd like to be able to do something like<br>
<br>
  array.map(String.prototype.toLowerCase)<br></blockquote><div><br></div></div></div></div></blockquote></div><div>I'd be quite comfortable with saying:</div><div>          array.map(str=>str.toLowerCase())</div><div>
<br></div><div>It preserves the integrity of of the string abstraction rather than just assuming that the naked String.prototype.toLowerCase function is the appropriate one for any particular str value.</div><div class="im">
<br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>Using <<a href="http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming" target="_blank">http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming</a>></div>

<br>    var bind = Function.prototype.bind;<br>    var uncurryThis = bind.bind(bind.call);</div></div></div></blockquote></div><div><div>or, in a slightly less obscure formulation that ignores "safety"):</div><div>
<br></div><div>let uncurryThis = f=>((a0, ...args)=>f.apply(a0, args))</div><div><br></div></div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>    array.map(uncurryThis("".toLowerCase))</div>
<div><br></div></div></div></div></blockquote><div><br></div><div>although, I still content that  </div><div><br></div><div>        array.map(str=>str.toLowerCase())</div><div><br></div><div>is the better formulation. (and fewer characters for those who worry about such things)</div>
</div></div></blockquote><div><br></div><div>It depends on what you're trying to express, as you pointed out earlier. Both address the FP vs OO mismatch -- your's by converting fp to oo, uncurryThis by converting oo to fp. Regarding Allen's question, I suspect your's is the better response ;).</div>
<div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div class="im"><div><br></div><blockquote type="cite">
<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
But map expects a function, while toLowerCase is only available as a<br>
method. So unless you rewrap all relevant APIs in functional style you<br>
have to deal with 'this' in one form or the other, and going back and<br>
forth is not pretty with what JS currently offers. (Mind you, a bind<br>
operator does not even address this particular example.)<br>
<span><font color="#888888"><br>
/Andreas<br>
</font></span><div><div><br>
</div></div></blockquote></div></div></div></blockquote></div></div><br><div>I think arrow functions are the appropriate syntactic convenience and since this started as a discussion of the :: extension we can assume arrows already exist.</div>
<div><br></div><div>We need to know and respect abstraction boundaries. I think careful thought is called for each time you cross the FP/OO boundary.  You can't just assume that the a function you extracted from a method property is the right function to use with other objects.  You can't just assume that the |this| value of a method corresponds to the first parameter of a function (or visa vera).</div>
<div><br></div><div>Just because we know how an object is build out of functions, you shouldn't routinely take an object abstraction I've created and rip it apart into ins more primitive constituent elements  which you then repurpose.  To me, this is analogous  to talking a function apart into its machine level code sequences and data structures and then doing clever things with them. It's possible, it might even be necessary in some very unusual situation, but it should never be routine.</div>
<span class="HOEnZb"><font color="#888888"><div><br></div><div>Allen</div><div><br></div><div><br></div></font></span></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>    Cheers,<br>    --MarkM
</div></div>