2012-04-03 4 views
67

자바 스크립트로 프로그래밍 할 때 디버거를 사용하여 언제든지 프로그램 실행을 중단하고 명령을 실행하고 거기에서 변수를 검사 할 수있는 편리한 매우 편리함을 알게되었습니다.최상위 함수 내부에서 정의 된 내부 함수를 테스트하고 상호 작용하는 가장 좋은 방법은 무엇입니까?

이제 Haskell로 돌아와 대화식 GHCI REPL에서 임의의 함수를 실행할 수있는 방법이 있습니까? 아니면 최상위 수준에서 선언 된 것에 한정되어 있습니까?

내부 기능 및 값을 작업하고 디버깅하는 "표준"접근 방식은 무엇입니까?

답변

85

GHCi의 중단 점에서 중지되면 범위에있는 모든 항목에 액세스 할 수 있습니다. 당신은 foo에 브레이크 포인트를 설정할 수 있습니다

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

하고 호출 시도 :의는이 같은 기능을 가지고 있다고 가정 해 봅시다

> :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이 시점에서 아직 범위에없는, 그래서 우리는 단계로이 한 번 :

0,123,516 :

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

+2

@brence : 대화식으로 정의 된 함수에 중단 점을 설정할 수 없습니다. 그래서 아니, 나는 그렇게 생각하지 않는다. – hammar

+0

아, 생명의 은인 답변, 정말 고마워! –