<br><br><div class="gmail_quote">On Fri, Apr 16, 2010 at 8:32 PM, Ben <span dir="ltr">&lt;<a href="mailto:midfield@gmail.com">midfield@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;">
hello --<br>
<br>
this is mostly a question for roman, or don, i guess.  suppose i have<br>
a list of similarly-sized vectors, and i want to add them up (possibly<br>
with coefficients), to yield a result vector.  something like<br>
<br>
module Main where<br>
<br>
import qualified Data.Vector.Generic as V<br>
import qualified Data.Vector.Unboxed as UV<br>
<br>
type Vec = UV.Vector Double<br>
<br>
axpy :: Double -&gt; Vec -&gt; Vec -&gt; Vec<br>
axpy a x y = V.zipWith (+) (V.map (* a) x) y<br>
<br>
sumVecs :: [(Double, Vec)] -&gt; Vec<br>
sumVecs axs =<br>
    let (a, x) = head axs<br>
    in foldl adder (V.map (* a) x) (tail axs)<br>
        where adder :: Vec -&gt; (Double, Vec) -&gt; Vec<br>
              adder v1 (a, x) = axpy a x v1<br>
<br>
how to i write this in a way which ensures recycling / fusion, e.g.<br>
in-place updates?<br></blockquote><div><br></div><div>One thing you can always do is check what the optimizer produces.  Don wrote ghc-core (on hackage) specifically for this task.  You should also try with -Odph, when -O2 isn&#39;t giving you the results you need.</div>
<div><br></div><div>Hopefully Don or Roman can give you tips on exploiting fusion when the optimizer doesn&#39;t do the right thing.</div><div><br></div><div>Jason</div></div>