2012-04-03 5 views
67

Quando programma in Javascript, trovo che sia estremamente conveniente poter utilizzare il debugger per interrompere l'esecuzione del programma in qualsiasi punto e poter eseguire comandi e controllare variabili da lì.Qual è il modo migliore per testare e interagire con le funzioni interne definite all'interno di una funzione di livello superiore?

Ora, di nuovo in Haskell, esiste un modo per eseguire funzioni arbitrarie in GHCI REPL interattivo o sono limitato alle cose dichiarate in toplevel?

Qual è l'approccio "standard" per il funzionamento e il debug di funzioni e valori interni?

risposta

85

Quando si è fermi a un punto di interruzione in GHCi, è possibile accedere a tutto ciò che è in ambito. Diciamo che si dispone di una funzione come questa:

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

È possibile impostare un punto di interruzione foo e provare chiamandolo:

> :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 non è portata ancora a questo punto, quindi dobbiamo fare un passo una volta:

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

Ora che g è portata, possiamo usare come qualsiasi funzione di primo livello:

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

È possibile eseguire un'operazione simile con le funzioni definite in GHCi? – haskelline

+2

@brence: non è possibile impostare punti di interruzione su funzioni definite in modo interattivo. Quindi no, non la penso così. – hammar

+0

Ah, una risposta salvavita, grazie mille! –