Come posso stampare una lista o qualcosa in Haskell ad ogni chiamata, ad esempio:Haskell Debug
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
Come posso stampare una lista o qualcosa in Haskell ad ogni chiamata, ad esempio:Haskell Debug
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
Per il debugging, c'è
import Debug.Trace
funct :: Integer -> [Integer] -> Bool
funct a list = trace (show list) $ funct (a + 1) (a : list)
dove trace :: String -> a -> a
. Utilizza unsafePerformIO
sotto il cofano, quindi è il male e solo per il debug.
Tenere presente che a causa di una valutazione lenta, l'output di debug può apparire in ordine sorprendente e intercalare con l'output che il programma normalmente genera.
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)
ottengo
*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
come previsto.
Come suggerito da Daniel Fisher, ma solo con unsafePerformIO
.
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
Date un'occhiata al similar question descrive ciò che sta realmente accadendo quando si utilizza unsafePerformIO
.
ma funziona solo per l'ultima chiamata, se vado in modo ricorsivo e entra in una guardia mostra solo l'ultima chiamata come posso fare per mostrare tutte le chiamate ??? – exilonX
Sarebbe molto sorprendente. A meno che la stringa di traccia sia costante e si compili con le ottimizzazioni, allora è normale. Per quanto sopra, ottengo l'output di tracciamento in ogni chiamata. –
scusa il mio errore :) – exilonX