<b><span style>d = [sum $ map (a !!) [i | i &lt;- b, j &lt;- c, i + j &lt; 3, i + j == dIndex] </span><span style>| dIndex &lt;- [0..3]]</span> </b><div><br clear="all">This is cool.</div><div><br></div><div>-Simon<br>
<br><br><div class="gmail_quote">On Sun, Feb 5, 2012 at 5:07 PM, L Corbijn <span dir="ltr">&lt;<a href="mailto:aspergesoepje@gmail.com">aspergesoepje@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">On Sun, Feb 5, 2012 at 7:28 AM, Haisheng Wu &lt;<a href="mailto:freizl@gmail.com">freizl@gmail.com</a>&gt; wrote:<br>
&gt; a = [1,1,1,1]<br>
&gt; b = [0,1,2,3]<br>
&gt; d = [0,0,0,0]<br>
&gt;<br>
&gt; for i in b:<br>
&gt;   for j in c:<br>
&gt;     if (i+j)&lt;3:<br>
&gt;       d[i+j] += a[i]<br>
&gt;<br>
&gt; My just work implementation in Haskell<br>
&gt; <a href="http://hpaste.org/57452" target="_blank">http://hpaste.org/57452</a><br>
&gt;<br>
&gt; Another people implementation in Haskell with Monad and it turns out complex<br>
&gt; and very imperatively.<br>
&gt; <a href="http://hpaste.org/57358" target="_blank">http://hpaste.org/57358</a><br>
&gt;<br>
&gt; Do you have any cool solution in FP way?<br>
&gt;<br>
&gt; Thanks.<br>
&gt; -Simon<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
<br>
There are several ways to make it nicer.<br>
Without assumption on what lists a, b and c contain it can be written as<br>
d = [sum $ map (a !!) [i | i &lt;- b, j &lt;- c, i + j &lt; 3, i + j == dIndex]<br>
| dIndex &lt;- [0..3]]<br>
<br>
With the assumption that b and c are both [0..3] this can be &#39;improved&#39; to<br>
d = (take 3 . map sum . tail $ inits a) ++ replicate (4 - 3) 0<br>
This generates the first three values by the complicated expression<br>
and then adds the extra zero&#39;s by using the replicate expression. This<br>
works as the value of the i-th element of d is the sum over the first<br>
i elements in a if i &lt; 3 and 0 otherwise. A list of lists with the<br>
first i elements is generated with &#39;tail $ inits a&#39; which is then<br>
summed and restricted to length 3.<br>
An alternative for this is<br>
d = (take 3 . snd $ mapAccumL (\acc ai -&gt; (acc + ai, acc + ai)) 0 a)<br>
++ replicate (4 - 3) 0<br>
Where the summation and tail generating is done in the mapAccumL function.<br>
<br>
Greetings,<br>
Lars<br>
<br>
P.S. Yes the replicate (4-3) 0 can be replaced by [0], but I wanted to<br>
explicitly include the length (4) of the expected list.<br>
</blockquote></div><br></div>