<div dir="ltr">Expanding on the comments of the OP (to give more information, not necessarily to support or be against it):<div><br></div><div>The "$" operator in Haskell is not a composition operator, it's essentially the same as python's apply builtin (the python2 builtin, removed for python 3), but with an operator syntax; the main trick behind it is that it's right associative, so you get that:</div><div><br></div><div>len $ set $ str $ foo => len $ (set $ (str $ foo)) -> len(set(str(foo)))</div><div><br></div><div>It looks a bit funky, and it works only reasonably with single-argument functions (which in haskell doesn't matter given that it uses currying that makes all function one argument functions with partial application). The best way to think about it for non Haskellers is that it's exactly like the "|" operators un UNIX-like shells, but with the reverse order; in UNIX, run foo, filter the output through str, then set, then len would read like:</div><div><br></div><div>foo | str | set | len, which is the same as above but right to left. This is to clarify that this si NOT about function composition, just an alternate application syntax</div><div><br></div><div>The second part of the example in the post, where composition is discussed actually relies in a completely orthogonal feature of Haskell  that allows to define partial operator applications as functions, for example you can define:</div><div>half = (/ 2) -- same as lambda x: x/2, so half 4 => 2</div><div><div>next = (+ 1) -- same as lambda x: x + 1, so next 7 => 8</div></div><div><div>invert = (1 /) -- same as lambda x: 1 / x, so invert 4 => 0.25</div></div><div><br></div><div>So this implies a new way of writing anonymous functions besides lambdas. To make the second part of the proposal work, both features should be present</div><div><br></div><div>Now going into the discussion itself, the second feature is much more invasive on the syntax+implementation (and also backwards comptibility, given that stuff like "(+ 1)" already mean something different in python). The first feature by itself shouldn't break stuff, and even if different to what we're used to is not very unidiomatic (it leads to cleaner code, although its meaning is definitely not very discoverable).</div><div><br></div><div>To get a rough idea on how that could work, take a look at <a href="https://gist.github.com/dmoisset/bd43b8c0ce26c9cff0ad297b7e1ba5f9">https://gist.github.com/dmoisset/bd43b8c0ce26c9cff0ad297b7e1ba5f9</a> ; I just used python ** operator because that's the only right associative one. Something similar provided in the default function type (and at a low level) could work. I'd probably would like to see some code samples where this is applied to check that it's worth the trouble.</div><div><br></div><div>D.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 26 October 2017 at 12:06, Yan Pas <span dir="ltr"><<a href="mailto:yanp.bugz@gmail.com" target="_blank">yanp.bugz@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I've looked up this feature in haskell. Dollar sign operator is used to avoid parentheses.<div><br></div><div>Rationalle:</div><div>Python tends to use functions instead of methods ( e.g.<font face="monospace, monospace"> len([1,2,3])</font> instead of <font face="monospace, monospace">[1,2,3].len()</font> ). Sometimes the expression inside parentheses may become big  and using a lot of parentheses may tend to bad readability. I suggest the following syntax:</div><div><br></div><div><font face="monospace, monospace">len $ [1,2,3]</font></div><div><br></div><div>Functions map be also  chained:</div><div><br></div><div><font face="monospace, monospace">len $ list $ map(...)</font></div><div><br></div><div>This operator may be used for function composition too:</div><div><br></div><div><font face="monospace, monospace">foo = len $ set $</font></div><div>in the same as</div><div><font face="monospace, monospace">foo = lambda *as,**kas : len(set(*as, **kas))</font></div><div><font face="arial, helvetica, sans-serif">in current syntax</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Regards,</font></div><div><font face="arial, helvetica, sans-serif">Yan</font></div></div>
<br>______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr">Daniel F. Moisset - <span style="font-size:small">UK Country Manager - Machinalis Limited</span><div><a href="http://www.machinalis.com" target="_blank">www.machinalis.co.uk</a></div><div>Skype: @dmoisset T: <span style="background-color:transparent;font-family:Arial;font-size:8pt;white-space:pre-wrap">+ 44 7398 827139</span></div><div><span><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap">1 Fore St, London, EC2Y 9DT</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="background-color:transparent;font-family:Arial;font-size:8pt;white-space:pre-wrap">Machinalis Limited is a company registered in England and Wales. Registered number: 10574987.</span></p></span></div></div></div></div></div></div>
</div>