Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell Debugging

How can I print a list or something in haskell at every call for example :

funct a list = funct (a + 1) (a : list) 
               print list here ??????? but how ? 
like image 997
exilonX Avatar asked Apr 21 '12 22:04

exilonX


2 Answers

For debugging, there's

import Debug.Trace

funct :: Integer -> [Integer] -> Bool 
funct a list = trace (show list) $ funct (a + 1) (a : list)

where trace :: String -> a -> a. It uses unsafePerformIO under the hood, so it's evil and only for debugging.

Be aware that due to lazy evaluation, the debugging output may appear in surprising order and interleaved with the output the program would normally generate.

With

module TraceIt where

import Debug.Trace

funct :: Integer -> [Integer] -> Bool
funct 10 list = null list
funct a list = trace (show list) $ funct (a + 1) (a : list)

I get

*TraceIt> funct 1 []
[]
[1]
[2,1]
[3,2,1]
[4,3,2,1]
[5,4,3,2,1]
[6,5,4,3,2,1]
[7,6,5,4,3,2,1]
[8,7,6,5,4,3,2,1]
False

as expected.

like image 164
Daniel Fischer Avatar answered Nov 18 '22 04:11

Daniel Fischer


Same as Daniel Fisher suggested, but with unsafePerformIO only.

> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }

Take a look at the similar question describes what is really going on when you use unsafePerformIO.

like image 1
ДМИТРИЙ МАЛИКОВ Avatar answered Nov 18 '22 05:11

ДМИТРИЙ МАЛИКОВ