<html><head></head><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:16px"><div id="yui_3_16_0_ym19_1_1460383895068_2868"><span id="yui_3_16_0_ym19_1_1460383895068_2900">Hi,</span></div><div id="yui_3_16_0_ym19_1_1460383895068_2870"><br><span></span></div><div id="yui_3_16_0_ym19_1_1460383895068_2871"><span id="yui_3_16_0_ym19_1_1460383895068_2923">Thanks for the comprehensive and considered answers. </span></div><div id="yui_3_16_0_ym19_1_1460383895068_2928"><span id="yui_3_16_0_ym19_1_1460383895068_2923">Maybe I'm missing something but defining the original function to have two definitions with a different number of args in each causes a compiler error ie. doing</span></div><div id="yui_3_16_0_ym19_1_1460383895068_3049"><br><span id="yui_3_16_0_ym19_1_1460383895068_2923"></span></div><div id="yui_3_16_0_ym19_1_1460383895068_3231" dir="ltr">mc :: (Integral a) => a -> amc x | x < 100 = x - 10 -- 1 arg<br id="yui_3_16_0_ym19_1_1460383895068_3052" clear="none">mc = mc . mc . (+ 11) -- no args<br></div><div id="yui_3_16_0_ym19_1_1460383895068_3238" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1460383895068_3239" dir="ltr">Thanks</div><div id="yui_3_16_0_ym19_1_1460383895068_3332" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1460383895068_3333" dir="ltr"><br></div> <div class="qtdSeparateBR"><br><br></div><div style="display: block;" class="yahoo_quoted"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif; font-size: 16px;"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif; font-size: 16px;"> <div dir="ltr"><font face="Arial" size="2"> On Sunday, 10 April 2016, 22:29, Silent Leaf <silent.leaf0@gmail.com> wrote:<br></font></div> <br><br> <div class="y_msg_container"><div id="yiv4054485531"><div><div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div>Mike: If you seek as I think you do, to write the function mc (partially) in point-free style, you must know this style implies no arguments, or at least not all arguments, mentioned, that is for example here:<br clear="none"></div>mc x | x < 100 = x - 10<br clear="none"></div>mc = mc . mc . (+ 11)<br clear="none"><br clear="none"></div>The second line will only be checked for pattern matching if the first one fails, so it amounts to the "otherwise" guard as here there's no pattern, so it's a bit like the pattern that always matches (mc _ = ...)<br clear="none">You'll remark I did write (mc =) and not (mc x =). Point free style amounts to describing a function through a composition of other functions, in an arguments-free way, here for example, (mc . mc . (+11)) being the composition of mc twice, with the "partially-applied" function (+11) == (\x -> x + 11) == (11+). This partially applied notation works for all operators by the way.<br clear="none"><br clear="none">And for the record, the whitespace operator is a pure myth. First you
can remove all whitespace, it still works. Second, try using the same
whitespace-induced universal right-associativity with (f a b): does it
amount to (f (a b))?<br clear="none"><br clear="none"></div></div><div>The reason for this right-associativity interpretation in (mc . mc (x + 11)) is because (.) itself is right associative: right-directed greediness could we say, in the vocabulary of regular expression. It's also the case of ($), and that's why we use it to counter the natural left associativity of function application:<br clear="none">f $ g a == f $ (g a) == ($) f (g a) == f (g a) -- (using the definition of ($) here)<br clear="none">instead of<br clear="none">f g a == (f g) a<br clear="none">without using ($).<br clear="none"><br clear="none"></div><div>The whitespace is just a meaningless character (I guess, a set of characters) used to separate juxtaposed meaningful tokens of the language when we have either (symbol,symbol) or (nonsymbol,nonsymbol), for example respectively (!! $ /= !!$) and (f g /= fg). whenever it's a nonsymbol and a symbol, whitespace is not necessary (a+, +a).<br clear="none"></div><div>Then there's the automatic, implicit function application between two juxtaposed non-symbolic tokens. But the whitespace has never been an operator of any kind, and is totally meaningless (and optional) in (mc . mc (x + 11)).<br clear="none"><br clear="none">Especially too, it's clear no whitespace survives the tokenization during the lexical phase of the (pre?) compilation, contrarily to all real operators like (+).<div class="yiv4054485531yqt8936234499" id="yiv4054485531yqtfd62117"><br clear="none"></div></div></div></div></div></div></div></div></div></div></div><br><div class="yqt8936234499" id="yqtfd49117">_______________________________________________<br clear="none">Beginners mailing list<br clear="none"><a shape="rect" ymailto="mailto:Beginners@haskell.org" href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br clear="none"><a shape="rect" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br clear="none"></div><br><br></div> </div> </div> </div></div></body></html>