2012-04-21 20 views
6

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 ? 

Odpowiedz

11

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.

+0

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

+0

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. –

+0

Przepraszam, mój błąd :) – exilonX

1

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.