2012-04-21 9 views
6

¿Cómo puedo imprimir una lista o algo en Haskell en cada llamada, por ejemplo:Haskell Depuración

funct a list = funct (a + 1) (a : list) 
       print list here ??????? but how ? 

Respuesta

11

Para la depuración, hay

import Debug.Trace 

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

donde trace :: String -> a -> a. Utiliza unsafePerformIO debajo del capó, por lo que es malo y solo para la depuración.

Tenga en cuenta que, debido a la evaluación diferida, la salida de depuración puede aparecer en orden sorprendente e intercalarse con la salida que normalmente generaría el programa.

Con

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) 

me sale

*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 

como se esperaba.

+0

pero funciona solo para la última llamada, si voy recursivamente y entra en un guardia, solo muestra la última llamada ¿cómo puedo mostrar todas las llamadas? – exilonX

+0

Eso sería muy sorprendente. A menos que su cadena de rastreo sea constante y compile con optimizaciones, entonces eso es normal. Para lo anterior, obtengo resultados de rastreo en cada llamada. –

+0

lo siento, mi error :) – exilonX

1

Lo mismo que Daniel Fisher sugirió, pero con unsafePerformIO solamente.

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

Tome un vistazo a la similar question describe lo que realmente está pasando cuando se utiliza unsafePerformIO.