2012-04-03 19 views
67

當我使用Javascript進行編程時,我發現它非常方便,能夠使用調試器在任何時候停止程序執行,並且能夠運行命令並從那裏檢查變量。測試頂層函數內部函數並與其進行交互的最佳方式是什麼?

現在回到Haskell,有沒有辦法在交互式GHCI REPL中運行任意函數,還是我僅限於在頂層聲明的東西?

什麼是工作和調試內部函數和值的「標準」方法?

回答

85

當您在GHCi的某個斷點處停下時,您可以訪問範圍內的任何內容。比方說,你有這樣的功能:

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

您可以在foo設置斷點,並嘗試調用它:

> :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不在範圍內還沒有在這一點上,所以我們必須步驟一次:現在

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

g在範圍上,我們可以使用它像任何頂級功能:

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

可以用GHCi中定義的函數做類似的事情嗎? – haskelline 2012-04-04 11:56:10

+2

@brence:您不能在交互定義的函數上設置斷點。所以不,我不這麼認爲。 – hammar 2012-04-04 17:17:41

+0

啊,救生員的答案,非常感謝! – 2013-10-03 20:30:30

相關問題