Jak mogę wydrukować listę lub coś w Haskell na każde wezwanie, na przykład:Haskell debugowanie
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
Jak mogę wydrukować listę lub coś w Haskell na każde wezwanie, na przykład:Haskell debugowanie
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
Do debugowania, tam
import Debug.Trace
funct :: Integer -> [Integer] -> Bool
funct a list = trace (show list) $ funct (a + 1) (a : list)
gdzie trace :: String -> a -> a
. Używa pod maską unsafePerformIO
, więc jest zła i tylko do debugowania.
Należy pamiętać, że ze względu na leniwą ocenę wynik debugowania może pojawić się w zaskakującej kolejności i przeplatany z wyjściem, który normalnie wygeneruje program.
Z
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)
uzyskać
*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
zgodnie z oczekiwaniami.
To samo, co sugerował Daniel Fisher, ale tylko z unsafePerformIO
.
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
Spójrz u similar question opisuje to, co naprawdę dzieje się podczas korzystania unsafePerformIO
.
ale działa tylko dla ostatniego połączenia, jeśli przejdę rekurencyjnie i wejdzie w strażnik pokazuje tylko ostatni telefon, w jaki sposób mogę wykonać wszystkie połączenia ??? – exilonX
To byłoby bardzo zaskakujące. O ile ciąg śledzenia nie jest stały i kompilujesz z optymalizacją, jest to normalne. Dla powyższego, otrzymuję dane wyjściowe śledzenia w każdym wywołaniu. –
Przepraszam, mój błąd :) – exilonX