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')</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 <- readIORef level</div><div> putStrLn (replicate (4*lvl) ' ' ++ 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 -> htrace (show x) x) [1..10]</div><div><br></div><div>s = foldl (\a b -> htrace "+" (a+b)) 0 xs</div><div>s2 = foldl' (\a b -> htrace "+" (a+b)) 0 xs</div><div><br>
</div><div>b = htrace "b" 2</div><div>c = htrace "c" 3</div><div>a = htrace "a" $ b + c</div><div>x = htrace "x" $ b + c</div><div><br></div><div><div>*HTrace> a</div><div>a</div>
<div> b</div><div> c</div><div>5</div><div>*HTrace> x</div><div>x</div><div>5</div></div><div><br></div><div><div>*HTrace> 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> 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>