¿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 ?
¿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 ?
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.
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
.
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
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. –
lo siento, mi error :) – exilonX