Wow, thanks for the thorough answer :). I already understood quite a bit about composition and eta reduction, but your response made it clear for me that this example couldn&#39;t be solved that easily.<br><br>Thanks for the information, it really helps.<br>


<br>Bas<br><br><div class="gmail_quote">On Tue, Nov 11, 2008 at 7:51 PM, Brent Yorgey <span dir="ltr">&lt;<a href="mailto:byorgey@seas.upenn.edu" target="_blank">byorgey@seas.upenn.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


<div>On Tue, Nov 11, 2008 at 12:40:19PM +0100, Bas van Gijzel wrote:<br>
&gt; Hi,<br>
&gt;<br>
&gt; I&#39;m trying to understand pointfree style better, but it&#39;s not coming along<br>
&gt; as well as I&#39;d like it to.<br>
&gt; The thing I can&#39;t get to work is to reduce an argument that is used more<br>
&gt; than once in a function.<br>
&gt;<br>
&gt; My function looks like this now (which works like it should):<br>
&gt; f x = g ((h . i) x) x<br>
&gt;<br>
&gt; But I&#39;d like to reduce the last argument x. I&#39;ve looked at the wiki[1] but I<br>
&gt; couldn&#39;t find a systematic way to obtain pointfree functions when they get<br>
&gt; more complicated.<br>
&gt; Any pointers to pages or papers with more examples of obtaining pointfree<br>
&gt; functions are appreciated.<br>
<br>
</div>If you&#39;re doing this just to learn, great. &nbsp;If you&#39;re doing this<br>
because you think a pointfree style is somehow &#39;better&#39;, you should<br>
know that there are limits. &nbsp;=) In the case of your function f above<br>
(and, in general, with any function that uses its argument more than<br>
once) I would leave it as it is. &nbsp;The really important things to know<br>
are composition, i.e.<br>
<br>
 &nbsp;f x = g (h (x)) &nbsp; &nbsp;becomes &nbsp;f x = (g . h) x<br>
<br>
and eta-reduction, i.e.<br>
<br>
 &nbsp;f x = foo x &nbsp; becomes &nbsp;f = foo.<br>
<br>
There are other things that can be nice, such as flip, and various<br>
Arrow combinators (such as (&amp;&amp;&amp;), (***)) for the (-&gt;) instance of<br>
Arrow [1] for use with functions involving tuples. &nbsp;Going much beyond that<br>
is often just obfuscation, IMO.<br>
<br>
But to answer your question, a systematic way to transform functions<br>
which use their argument more than once into pointfree versions is to<br>
use the ((-&gt;) e) (aka reader) monad [2]:<br>
<br>
 &nbsp;f x = g (h x) x &nbsp; becomes &nbsp; f x = (h &gt;&gt;= g) x<br>
<br>
Essentially, in the ((-&gt;) e) monad, (&gt;&gt;=) is a combinator to do<br>
exactly what you are asking about -- compose two functions with a<br>
duplicated input. &nbsp;Of course, if you dig into the implementation of<br>
(&gt;&gt;=) for the ((-&gt;) e) monad, you will eventually find a function<br>
which is not point-free -- this is unavoidable at some level; you<br>
can&#39;t actually duplicate an arbitrary thing without giving it a name.<br>
<br>
Applying this to your example:<br>
<div><br>
 &nbsp;f x = g ((h . i) x) x<br>
</div> &nbsp;f x = ((h . i) &gt;&gt;= g) x<br>
 &nbsp;f &nbsp; = (h . i) &gt;&gt;= g<br>
<br>
-Brent<br>
<br>
[1] <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.html" target="_blank">http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.html</a><br>
[2] <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-Instances.html" target="_blank">http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-Instances.html</a><br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</blockquote></div><br>