<div dir="ltr">I didn't think of forcing xs to the end. I thought that I might be able to convert the dot to something with type<div><br></div><div><font face="monospace, monospace">   (a -> b -> c) -> (b -> b) -> a -> b -> c</font></div><div><font face="monospace, monospace"><br></font></div>I tried flipping <font face="monospace, monospace">((.).(.))</font> but got<div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">   (a -> b -> c) -> (c -> d) -> a -> b -> d</font></div><div><font face="monospace, monospace"><br></font></div>which is not what I wanted.<div><br><div>Thanks for the mini-tutorial. <img src="cid:ezweb_ne_jp.B97@goomoji.gmail" goomoji="ezweb_ne_jp.B97" style="margin: 0px 0.2ex; vertical-align: middle;"><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 24 February 2015 at 18:58, Michael Orlitzky <span dir="ltr"><<a href="mailto:michael@orlitzky.com" target="_blank">michael@orlitzky.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 02/24/2015 12:57 AM, Sumit Sahrawat, Maths & Computing, IIT (BHU) wrote:<br>
> Thanks.<br>
> You've given me a good exercise in equational reasoning.<br>
><br>
> I'm studying such things because I might start studying combinatory logic<br>
> (Smullyan's mockingbird book) soon.<br>
> It's a good exercise for the mind, and is very enjoyable with pencil &<br>
> paper.<br>
> Can you give me some more patterns like transducers (foldl foldl) and the<br>
> dot-dot-dot ( boobies, in your words :) ) example?<br>
><br>
<br>
</span>I cheated with the pointfree tool, but you can do it by hand, too. The<br>
only trick you need to know in this case is how to get the extra<br>
argument on the end. You start with,<br>
<span class=""><br>
  conv xs = sum . zipWith (*) xs . reverse<br>
<br>
</span>and obviously, you want the 'xs' on the end. So you want to switch the<br>
'zipWith (*) xs' and 'reverse' somehow. Well, you can always flip the<br>
composition operator! Unfortunately it's no longer infix at that point,<br>
so it has to be written like,<br>
<br>
  conv xs = sum . (flip (.)) reverse (zipWith (*) xs)<br>
<br>
Now the secret is that putting an extra dot around the chain of<br>
functions takes it from a one-argument chain to a two-argument chain<br>
(where the first function in the chain eats the second argument). You<br>
can sort of see this in the type of 'sum' and '(sum .)':<br>
<br>
  ghci> :t sum<br>
  sum :: Num a => [a] -> a<br>
<br>
  ghci> :t (sum .)<br>
  (sum .) :: Num c => (a -> [c]) -> a -> c<br>
<br>
The second one essentially eats an argument by taking "something that<br>
will give me a list" instead of a list itself. You have to do the same<br>
thing with the '(flip (.)) reverse' part of the chain:<br>
<br>
  conv = (sum .) . (((flip (.)) reverse) .) zipWith (*)<br>
<br>
Now, since you've got '((flip (.)) reverse' in parentheses anyway, you<br>
can change it from a normal function application to a "section," i.e.<br>
these two are the same: (flip (.)) reverse == (. reverse). So you wind<br>
up with,<br>
<br>
  conv = (sum .) . (((. reverse) .) zipWith (*)<br>
<br>
Drop the useless parentheses,<br>
<span class=""><br>
  conv = (sum .) . (. reverse) . zipWith (*)<br>
<br>
</span>and now all that's left to do is pray that you aren't hanged for witchcraft.<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div>Regards</div><div dir="ltr"><div><br></div><div>Sumit Sahrawat</div></div></div></div></div></div></div>
</div>