Was ist der beste Weg, um innere Funktionen zu testen und mit ihnen zu interagieren, die in einer Toplevel-Funktion definiert sind?

70

Wenn ich in Javascript programmiere, finde ich es äußerst praktisch, den Debugger zu verwenden, um die Programmausführung jederzeit anzuhalten und von dort aus Befehle auszuführen und Variablen zu überprüfen.

Gibt es in Haskell eine Möglichkeit, beliebige Funktionen in der interaktiven GHCI-REPL auszuführen, oder bin ich auf Dinge beschränkt, die auf der obersten Ebene deklariert wurden?

Was ist der "Standard" -Ansatz zum Arbeiten und Debuggen innerer Funktionen und Werte?

Hugomg
quelle

Antworten:

85

Wenn Sie an einem Haltepunkt in GHCi angehalten werden, können Sie auf alles zugreifen, was in den Geltungsbereich fällt. Angenommen, Sie haben eine Funktion wie diese:

foo :: Int -> Int
foo x = g (x + 2)
  where g y = x^y 

Sie können einen Haltepunkt festlegen foound versuchen, ihn aufzurufen:

> :break foo
Breakpoint 1 activated at /tmp/Foo.hs:(2,1)-(3,17)
> foo 42
Stopped at /tmp/Foo.hs:(2,1)-(3,17)
_result :: Int = _

g ist zu diesem Zeitpunkt noch nicht im Geltungsbereich, daher müssen wir einmal vorgehen:

[/tmp/Foo.hs:(2,1)-(3,17)] > :step
Stopped at /tmp/Foo.hs:2:9-17
_result :: Int = _
g :: Integral b => b -> Int = _
x :: Int = 42

Nun, da dies gim Umfang liegt, können wir es wie jede Funktion der obersten Ebene verwenden:

[/tmp/Foo.hs:2:9-17] > g 2
1764
[/tmp/Foo.hs:2:9-17] > g 3
74088
Hammar
quelle
Kann etwas Ähnliches mit in GHCi definierten Funktionen gemacht werden?
Haskelline
2
@brence: Sie können keine Haltepunkte für interaktiv definierte Funktionen festlegen. Also nein, ich denke nicht.
Hammar