2012-04-03 20 views
67

Kiedy programuję w JavaScript, uważam, że jest to ekstremalnie wygodny, aby móc użyć debuggera do zatrzymania wykonywania programu w dowolnym momencie i móc uruchamiać polecenia oraz sprawdzać stamtąd zmienne.Jaki jest najlepszy sposób testowania i interakcji z funkcjami wewnętrznymi zdefiniowanymi w funkcji toplevel?

Teraz, w Haskell, czy istnieje sposób na uruchamianie dowolnych funkcji w interaktywnym REZERWACJI GHCI lub czy ograniczam się do rzeczy zadeklarowanych w toplevel?

Jakie jest "standardowe" podejście do pracy i debugowania wewnętrznych funkcji i wartości?

Odpowiedz

85

Po zatrzymaniu się w punkcie przerwania w GHCi, można uzyskać dostęp do wszystkiego, co jest w zakresie. Powiedzmy, że masz funkcję tak:

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

Można ustawić punkt przerwania na foo i spróbować nazywając go:

> :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 nie jest w zakresie jeszcze w tym momencie, więc mamy do kroku kiedyś:

[/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 

teraz g jest w zakresie, możemy użyć go jak każdy funkcją najwyższego poziomu:

[/tmp/Foo.hs:2:9-17] > g 2 
1764 
[/tmp/Foo.hs:2:9-17] > g 3 
74088 
+0

Czy można coś podobnego zrobić z funkcjami zdefiniowanymi w GHCi? – haskelline

+2

@brence: Nie można ustawić punktów przerwania dla funkcji zdefiniowanych interaktywnie. Więc nie, nie sądzę. – hammar

+0

Ach, odpowiedź ratownika, wielkie dzięki! –

Powiązane problemy