<div dir="ltr">seq only force to WHNF (<a href="https://wiki.haskell.org/Weak_head_normal_form">https://wiki.haskell.org/Weak_head_normal_form</a>), while deepseq could force elements in the data structure (hence the name)<div><br></div><div><div>list1 :: [Int]</div><div>list1 = [undefined]</div><div><br></div><div>list1' = length (list1 `seq` list1)               -- OK</div><div>list1'' = length (list1 `deepseq` list1)      -- error</div><div><br></div><div>I'd expect something similar happened in IArray.</div><div><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Apr 26, 2016 at 11:36 PM Chul-Woong Yang <<a href="mailto:cwyang@aranetworks.com">cwyang@aranetworks.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thank you for your answer.<br>
I'll look into MArray.<br>
<br>
However, I want to know whether `seq` forces evaluation<br>
of array update (//) or not.<br>
My prior experimen shows that `deepseq` forces evaluation<br>
while `seq` does not force. Is it right?<br>
And, is there no way to force evaluation of array update<br>
with `seq`?<br>
<br>
2016-04-27 15:12 GMT+09:00 Baojun Wang <<a href="mailto:wangbj@gmail.com" target="_blank">wangbj@gmail.com</a>>:<br>
> Immutable array update creates a new array for each call to update (//),<br>
> thus if you need frequent update, it is recommended to use MArray (such as<br>
> ST or IO variant) instead.<br>
><br>
> i.e: the loop can be rewrite as:<br>
><br>
> update_ u x = readArray u x >>= \old -> writeArray u x (1+old)<br>
> array100 = runSTUArray $ do<br>
>   stu <- newArray (0, 99) 0 :: ST s (STUArray s Int Int)<br>
>   mapM_ (update_ stu) (concat . replicate 5000 $ [0..99])<br>
>   return stu<br>
><br>
> - baojun<br>
><br>
> On Tue, Apr 26, 2016 at 4:53 PM Chul-Woong Yang <<a href="mailto:cwyang@aranetworks.com" target="_blank">cwyang@aranetworks.com</a>><br>
> wrote:<br>
>><br>
>> Hi, all<br>
>><br>
>> When I fold a list to update Data.Array,<br>
>> memory usage is very high.<br>
>> Consider following source, which counts occurence of<br>
>> each element in a list (1):<br>
>><br>
>> import Data.Array<br>
>> import Data.List<br>
>> import Control.DeepSeq<br>
>> go :: [Int] -> [Int]<br>
>> go = elems . foldl' update (array (0,99) [(i,0) | i <- [0..99]])<br>
>>   where update acc x = acc // [(x, acc ! x + 1)]<br>
>> main = putStrLn . unwords . map show . go . concat .<br>
>>        replicate 5000 $ [0..99]<br>
>><br>
>> Above program uses about 350MB at heap.<br>
>> Memory usage is same if  I try to force strictness in array update<br>
>> with `seq` (2) :<br>
>><br>
>>   where update acc x = let v = acc ! x + 1<br>
>>                            a' = acc // [(x,v `seq` v)]<br>
>>                        in a' `seq` a'<br>
>><br>
>> However, when I use `deepseq`, memory usage is gone<br>
>> (around 35Kbyte) (3):<br>
>><br>
>>   where update acc x = let v = acc ! x + 1<br>
>>                            a' = acc // [(x,v `seq` v)]<br>
>>                        in a' `deepseq` a'<br>
>><br>
>> What's the missing part in (2)? At (2), evaluation of<br>
>> updated array a' is forced and the value of array cell<br>
>> is also evaluated forcefully with `seq`.<br>
>><br>
>> Any help would be appreciated deeply.<br>
>> --<br>
>> Regards,<br>
>> Chul-Woong Yang<br>
>> _______________________________________________<br>
>> Beginners mailing list<br>
>> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
><br>
><br>
> _______________________________________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
><br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>