Hi cafe,<div><br></div><div>Look how one can watch the evaluation tree of a computation, to debug laziness-related problems.</div><div><br></div><div><div>{-# LANGUAGE BangPatterns #-}</div><div>module HTrace where</div><div>

<br></div><div>import Data.List (foldl&#39;)</div><div>import Data.IORef</div><div>import System.IO.Unsafe</div><div><br></div><div>level = unsafePerformIO $ newIORef 0</div><div><br></div><div>htrace str x = unsafePerformIO $ do</div>

<div>  lvl &lt;- readIORef level</div><div>  putStrLn (replicate (4*lvl) &#39; &#39; ++ str)</div><div>  writeIORef level (lvl+1)</div><div>  let !vx = x</div><div>  writeIORef level lvl</div><div>  return vx</div><div><br>

</div><div>xs = map (\x -&gt; htrace (show x) x) [1..10]</div><div><br></div><div>s = foldl (\a b -&gt; htrace &quot;+&quot; (a+b)) 0 xs</div><div>s2 = foldl&#39; (\a b -&gt; htrace &quot;+&quot; (a+b)) 0 xs</div><div><br>

</div><div>b = htrace &quot;b&quot; 2</div><div>c = htrace &quot;c&quot; 3</div><div>a = htrace &quot;a&quot; $ b + c</div><div>x = htrace &quot;x&quot; $ b + c</div><div><br></div><div><div>*HTrace&gt; a</div><div>a</div>

<div>    b</div><div>    c</div><div>5</div><div>*HTrace&gt; x</div><div>x</div><div>5</div></div><div><br></div><div><div>*HTrace&gt; s</div><div>+</div><div>    +</div><div>        +</div><div>            +</div><div>                +</div>

<div>                    +</div><div>                        +</div><div>                            +</div><div>                                +</div><div>                                    +</div><div>                                        1</div>

<div>                                    2</div><div>                                3</div><div>                            4</div><div>                        5</div><div>                    6</div><div>                7</div>

<div>            8</div><div>        9</div><div>    10</div><div>55</div></div><div><br></div><div>(reload)</div><div><div>*HTrace&gt; s2</div><div>+</div><div>    1</div><div>+</div><div>    2</div><div>+</div><div>    3</div>

<div>+</div><div>    4</div><div>+</div><div>    5</div><div>+</div><div>    6</div><div>+</div><div>    7</div><div>+</div><div>    8</div><div>+</div><div>    9</div><div>+</div><div>    10</div><div>55</div></div><div>

<br></div>-- <br>Eugene Kirpichov<br>Principal Engineer, Mirantis Inc. <a href="http://www.mirantis.com/" target="_blank">http://www.mirantis.com/</a><br>Editor, <a href="http://fprog.ru/" target="_blank">http://fprog.ru/</a><br>


</div>