6 Stimmen

Haskell Debugging

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 ?

11voto

Daniel Fischer Punkte 178428

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.

1voto

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

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.

Powered by:

X