[Haskell-beginners] Tracing a program with putStrLn

legajid legajid at free.fr
Sat Jan 30 18:12:35 EST 2010


OK, that's a great help.


Michael Snoyman a écrit :
> I think you want the Debug.Trace module. The documentation is 
> available at 
> http://haskell.org/ghc/docs/latest/html/libraries/base/Debug-Trace.html.
>
> Let me know if you have any questions,
> Michael
>
> On Sun, Jan 31, 2010 at 12:00 AM, legajid <legajid at free.fr 
> <mailto:legajid at free.fr>> wrote:
>
>     Hi,
>
>     i wrote a program that doesn't behave as i wanted.
>     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 <- instead of let , add
>     returns) and so on for each function called. Debugging this way
>     causes  more trouble than it should save.
>
>     What is the way to trace data thru function recursive calls
>     without changing program structures? Is putStrLn a good idea ?
>     I'm not used to ghci debug and i find it hard to manage (:break,
>     :trace, :cont ...).
>     Is the 'debugged' version as efficient as the first one, due to
>     impure functional code? What if i want to remove 'debug code' ?
>      Should i  modify back my functions ?
>
>     Here are two very simplified versions of my program, the first one
>     without 'trace', the second modified to include putStrLn as wanted.
>
>
>     Thanks in advance,
>     Didier
>
>
>     First version
>     -------------
>
>     main=do
>       let valeurs=[0,1,3,0]
>       let (valeurs_new)=calcul valeurs
>       afficher_resultat valeurs
>       afficher_resultat valeurs_new
>
>     calcul :: [Int] -> [Int]
>     calcul xv   | nblibr == 0    = map (*2) xv
>       | otherwise    = map (+1) xv
>                         where
>               libres = [ x | x <- [1..length xv] ,  xv !! (x-1) == 0]
>               nblibr=length libres
>
>     afficher_resultat xv = do
>       putStrLn (show xv)
>
>
>     Second version
>     ----------------
>
>     main=do
>       let valeurs=[0,1,3,0]
>
>       valeurs_new <- calcul valeurs
>
>       afficher_resultat valeurs
>       afficher_resultat valeurs_new
>
>     calcul :: [Int] -> IO [Int]
>     calcul xv     | nblibr == 0    = do
>                   putStrLn "ok"
>                   return (map (*2) xv)
>       | otherwise    =     return (map (+1) xv)
>                         where
>               libres = [ x | x <- [1..length xv] ,  xv !! (x-1) == 0]
>               nblibr=length libres
>
>     afficher_resultat xv = do
>       putStrLn (show xv)
>
>     _______________________________________________
>     Beginners mailing list
>     Beginners at haskell.org <mailto:Beginners at haskell.org>
>     http://www.haskell.org/mailman/listinfo/beginners
>
>


More information about the Beginners mailing list