2012-04-03 10 views
67

Khi tôi lập trình Javascript, tôi thấy nó cực kỳ thuận tiện để có thể sử dụng trình gỡ lỗi để tạm dừng thực thi chương trình tại bất kỳ thời điểm nào và có thể chạy lệnh và kiểm tra biến từ đó.Cách tốt nhất để kiểm tra và tương tác với các hàm bên trong được định nghĩa bên trong một hàm toplevel là gì?

Bây giờ, hãy quay trở lại Haskell, có cách nào để chạy các chức năng tùy ý trong GHCI REPL tương tác hay tôi bị giới hạn ở những thứ được khai báo ở mức cao?

Phương pháp "chuẩn" để làm việc và gỡ lỗi các hàm và giá trị bên trong là gì?

Trả lời

85

Khi bạn dừng lại tại điểm dừng trong GHCi, bạn có thể truy cập mọi thứ nằm trong phạm vi. Hãy nói rằng bạn có một chức năng như thế này:

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

Bạn có thể đặt một breakpoint trên foo và thử gọi nó:

> :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 không nằm trong phạm vi chưa vào thời điểm này, vì vậy chúng ta phải bước một lần:

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

Bây giờ g là trong phạm vi, chúng ta có thể sử dụng nó như bất kỳ chức năng cấp cao nhất:

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

Có thể thực hiện điều gì đó tương tự với các chức năng được xác định trong GHCi? – haskelline

+2

@brence: Bạn không thể đặt điểm ngắt trên các hàm được xác định tương tác. Vì vậy, không, tôi không nghĩ như vậy. – hammar

+0

Ah, một câu trả lời cho phao cứu sinh, cảm ơn rất nhiều! –