<div dir="ltr">-- + Roman,<div><br></div><div>-- hey Roman,</div><div><br></div><div>-- seems like i cant use deepseq or Generic derive of NFData on data types containing vectors.  The following code tries to use deepseq to force evaluation of a type containing vectors, but when the code is running it seems to not work as expected (blows up in memory).  any ideas?</div>
<div><br></div><div><br></div><div><div style="font-family:arial,sans-serif;font-size:13px">{-# LANGUAGE DeriveGeneric #-}</div><div style="font-family:arial,sans-serif;font-size:13px">import Control.DeepSeq</div><div style="font-family:arial,sans-serif;font-size:13px">
import System.IO</div><div style="font-family:arial,sans-serif;font-size:13px">import GHC.Generics (Generic)</div><div style="font-family:arial,sans-serif;font-size:13px">import qualified Data.Vector as V</div><div style="font-family:arial,sans-serif;font-size:13px">
import qualified Data.ByteString.Lazy.Char8 as BL</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">scanl&#39; :: NFData a =&gt; (a -&gt; b -&gt; a) -&gt; a -&gt; [b] -&gt; [a]</div>
<div style="font-family:arial,sans-serif;font-size:13px">scanl&#39; f q ls =  q : (case ls of</div><div style="font-family:arial,sans-serif;font-size:13px">                        []   -&gt; []</div><div style="font-family:arial,sans-serif;font-size:13px">
                        x:xs -&gt; let q&#39; = f q x</div><div style="font-family:arial,sans-serif;font-size:13px">                                in q&#39; `deepseq` scanl&#39; f q&#39; xs)</div><div style="font-family:arial,sans-serif;font-size:13px">
<br></div><div style="font-family:arial,sans-serif;font-size:13px">-- this runs without blowing up</div><div style="font-family:arial,sans-serif;font-size:13px">-- main = print $ last $ scanl&#39; (+) (0::Int) [0..]</div>
<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">data Simple = Simple (V.Vector Double)</div><div style="font-family:arial,sans-serif;font-size:13px">
            deriving (Show, Generic)</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">instance NFData Simple</div><div style="font-family:arial,sans-serif;font-size:13px">
<br></div><div style="font-family:arial,sans-serif;font-size:13px">--this blows up</div><div style="font-family:arial,sans-serif;font-size:13px">main = do</div><div style="font-family:arial,sans-serif;font-size:13px">   let initial = Simple $ V.fromList (take 100 $ repeat 0)</div>
<div style="font-family:arial,sans-serif;font-size:13px">       sumvs (Simple a) (Simple b) = Simple $ V.zipWith (+) a b</div><div style="font-family:arial,sans-serif;font-size:13px">   print $ last $ scanl&#39; sumvs initial $ repeat $ initial</div>
</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Apr 16, 2013 at 12:36 PM, anatoly yakovenko <span dir="ltr">&lt;<a href="mailto:aeyakovenko@gmail.com" target="_blank">aeyakovenko@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">This compiles but the process runs out of memory, so it seams that NFData derivation isn&#39;t doing its job.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Apr 16, 2013, at 12:15 PM, José Pedro Magalhães &lt;<a href="mailto:jpm@cs.uu.nl">jpm@cs.uu.nl</a>&gt; wrote:<br>
<br>
&gt; What is the error that you get?<br>
&gt;<br>
&gt;<br>
&gt; Cheers,<br>
&gt; Pedro<br>
&gt;<br>
&gt; On Tue, Apr 16, 2013 at 8:07 PM, Anatoly Yakovenko &lt;<a href="mailto:aeyakovenko@gmail.com">aeyakovenko@gmail.com</a>&gt; wrote:<br>
&gt; -- ok, something in deriving NFData using Generics in a type that has a Vector in it.<br>
&gt;<br>
&gt;<br>
&gt; {-# LANGUAGE DeriveGeneric #-}<br>
&gt; import Control.DeepSeq<br>
&gt; import System.IO<br>
&gt; import GHC.Generics (Generic)<br>
&gt; import qualified Data.Vector as V<br>
&gt; import qualified Data.ByteString.Lazy.Char8 as BL<br>
&gt;<br>
&gt; scanl&#39; :: NFData a =&gt; (a -&gt; b -&gt; a) -&gt; a -&gt; [b] -&gt; [a]<br>
&gt; scanl&#39; f q ls =  q : (case ls of<br>
&gt;                         []   -&gt; []<br>
&gt;                         x:xs -&gt; let q&#39; = f q x<br>
&gt;                                 in q&#39; `deepseq` scanl&#39; f q&#39; xs)<br>
&gt;<br>
&gt; -- this runs without blowing up<br>
&gt; -- main = print $ last $ scanl&#39; (+) (0::Int) [0..]<br>
&gt;<br>
&gt; data Simple = Simple (V.Vector Double)<br>
&gt;             deriving (Show, Generic)<br>
&gt;<br>
&gt; instance NFData Simple<br>
&gt;<br>
&gt; --this blows up<br>
&gt; main = do<br>
&gt;    let initial = Simple $ V.fromList (take 100 $ repeat 0)<br>
&gt;        sumvs (Simple a) (Simple b) = Simple $ V.zipWith (+) a b<br>
&gt;    print $ last $ scanl&#39; sumvs initial $ repeat $ initial<br>
&gt;<br>
&gt;<br>
&gt;<br>
&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>
&gt;<br>
<br>
</div></div></blockquote></div><br></div>