Wie kann ich in Haskell eine Liste oder etwas ähnliches bei jedem Aufruf drucken, zum Beispiel :
funct a list = funct (a + 1) (a : list)
print list here ??????? aber wie ?
Wie kann ich in Haskell eine Liste oder etwas ähnliches bei jedem Aufruf drucken, zum Beispiel :
funct a list = funct (a + 1) (a : list)
print list here ??????? aber wie ?
Zum Debuggen gibt es Folgendes:
import Debug.Trace
funct :: Integer -> [Integer] -> Bool
funct a list = trace (show list) $ funct (a + 1) (a : list)
wo trace :: String -> a -> a
benutzt wird. Es verwendet unsafePerformIO
unter der Haube, daher ist es böse und nur zum Debuggen gedacht.
Beachten Sie, dass aufgrund der verzögerten Auswertung die Debug-Ausgabe in einer überraschenden Reihenfolge erscheinen und mit der Ausgabe, die das Programm normalerweise generieren würde, verflochten sein kann.
Mit
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)
erhalte ich
*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
wie erwartet.
Genau wie Daniel Fisher vorgeschlagen hat, aber nur mit unsafePerformIO
.
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
Schau dir die ähnliche Frage an, die beschreibt, was wirklich passiert, wenn du unsafePerformIO
verwendest.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.