<div dir="ltr">I think you want the Debug.Trace module. The documentation is available at <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Debug-Trace.html">http://haskell.org/ghc/docs/latest/html/libraries/base/Debug-Trace.html</a>.<br>
<br>Let me know if you have any questions,<br>Michael<br><br><div class="gmail_quote">On Sun, Jan 31, 2010 at 12:00 AM, legajid <span dir="ltr">&lt;<a href="mailto:legajid@free.fr">legajid@free.fr</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi,<br>
<br>
i wrote a program that doesn&#39;t behave as i wanted.<br>
So i tried to putStrLn my data structures to see what happened. Since i did this, all my functions changed type, so i had to modify them (main and calcul : use &lt;- instead of let , add returns) and so on for each function called. Debugging this way causes  more trouble than it should save.<br>

<br>
What is the way to trace data thru function recursive calls without changing program structures? Is putStrLn a good idea ?<br>
I&#39;m not used to ghci debug and i find it hard to manage (:break, :trace, :cont ...).<br>
Is the &#39;debugged&#39; version as efficient as the first one, due to impure functional code? What if i want to remove &#39;debug code&#39; ?  Should i  modify back my functions ?<br>
<br>
Here are two very simplified versions of my program, the first one without &#39;trace&#39;, the second modified to include putStrLn as wanted.<br>
<br>
<br>
Thanks in advance,<br>
Didier<br>
<br>
<br>
First version<br>
-------------<br>
<br>
main=do<br>
   let valeurs=[0,1,3,0]<br>
   let (valeurs_new)=calcul valeurs<br>
   afficher_resultat valeurs<br>
   afficher_resultat valeurs_new<br>
<br>
calcul :: [Int] -&gt; [Int]<br>
calcul xv    | nblibr == 0    = map (*2) xv<br>
   | otherwise    = map (+1) xv<br>
                      where<br>
           libres = [ x | x &lt;- [1..length xv] ,  xv !! (x-1) == 0]<br>
           nblibr=length libres<br>
<br>
afficher_resultat xv = do<br>
   putStrLn (show xv)<br>
<br>
<br>
Second version<br>
----------------<br>
<br>
main=do<br>
   let valeurs=[0,1,3,0]<br>
<br>
   valeurs_new &lt;- calcul valeurs<br>
<br>
   afficher_resultat valeurs<br>
   afficher_resultat valeurs_new<br>
<br>
calcul :: [Int] -&gt; IO [Int]<br>
calcul xv     | nblibr == 0    = do<br>
               putStrLn &quot;ok&quot;<br>
               return (map (*2) xv)<br>
   | otherwise    =     return (map (+1) xv)<br>
                     where<br>
           libres = [ x | x &lt;- [1..length xv] ,  xv !! (x-1) == 0]<br>
           nblibr=length libres<br>
<br>
afficher_resultat xv = do<br>
   putStrLn (show xv)<br>
<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</blockquote></div><br></div>