2010-07-12 6 views
5

저는 Real World Haskell의 초기 챕터 연습을 통해 작업 중이며 GHCi에서 각 재귀 호출의 매개 변수를 사용하여 함수 평가를 표시 할 수있는 옵션이 있는지 알고 싶습니다. 그래서 예를 들어 간단한 'map'버전을 썼는데, 적용했을 때 GHCi가 실제 인수 (그리고 표현식 결과)로 각 재귀 호출을 표시하도록하고 싶습니다. 무언가가 나를 뒤에서 무엇을 따라갈 수 있습니다.실행 스택을 표시하는 ghci

P. 이 글을 쓰면서 나는 haskell의 실행 모델의 게으름에 의해 제한 될 수도 있다는 느낌을 가지고있다. 내가 잘못하면 나를 바로 잡는다.

+1

가능한 복제본 [하스켈에서 호출 스택을 얻는 방법은 무엇입니까?] (http://stackoverflow.com/questions/3220869/how-do-i-get-a-callstack-in-haskell) – rampion

+0

그것의 중복. – jrockway

답변

2

이를 위해 후드를 사용할 수 있습니다

import Debug.Hood.Observe 

map2 f [] = [] 
map2 f (x:xs) = f x : (observe "map2" $ map2) f xs 

main = runO $ print $ map2 (+1) ([1..10] :: [Int]) 

당신이 그것을 실행하면 해당 인수 MAP2 각 전화를 인쇄한다 리턴 된 결과

. 
. 
. 
-- map2 
{ \ { \ 10 -> 11 
    , \ 9 -> 10 
    } (9 : 10 : []) 
    -> 10 : 11 : [] 
} 
-- map2 
{ \ { \ 10 -> 11 
    } (10 : []) 
    -> 11 : [] 
} 
-- map2 
{ \ _ [] -> [] 
} 

자세한 내용은 examples을 확인하십시오.

+0

ghci에서 작동하도록 확인되었습니다. 7.8.2. –

3

나는 일반적으로 Debug.Trace 사용

import Debug.Trace 

buggy acc xs | traceShow (acc,xs) False = undefined 
buggy acc []  = acc 
buggy acc (x:xs) = buggy (acc + x) xs 

main = print $ buggy 0 [1..10] 

이 버그 기능이 어떻게 작동하는지 나를 볼 수 있습니다 :

(0,[1,2,3,4,5,6,7,8,9,10]) 
(1,[2,3,4,5,6,7,8,9,10]) 
(3,[3,4,5,6,7,8,9,10]) 
(6,[4,5,6,7,8,9,10]) 
(10,[5,6,7,8,9,10]) 
(15,[6,7,8,9,10]) 
(21,[7,8,9,10]) 
(28,[8,9,10]) 
(36,[9,10]) 
(45,[10]) 
(55,[]) 
55 

의 열쇠가 일치하지 않는 것 동안 일치하지 않지만 뭔가를 인쇄 결코 패턴을 갖는 . 그런 식으로 항상 평가되고 (따라서 디버깅 정보가 인쇄됩니다) 모든 기능을 쉽게 적용 할 수 있습니다. 그러나 당신은 또한 당신이 특정 사건을보고 싶은 경우는 같은 일치 할 수 있습니다 :

buggy acc [] = acc 
buggy acc (x:xs) | traceShow (acc, x, xs) True = buggy (acc + x) xs 

그런 다음 당신은 단지 비 기지의 경우에 디버깅 출력을 얻을 :

(0,1,[2,3,4,5,6,7,8,9,10]) 
(1,2,[3,4,5,6,7,8,9,10]) 
(3,3,[4,5,6,7,8,9,10]) 
(6,4,[5,6,7,8,9,10]) 
(10,5,[6,7,8,9,10]) 
(15,6,[7,8,9,10]) 
(21,7,[8,9,10]) 
(28,8,[9,10]) 
(36,9,[10]) 
(45,10,[]) 
55 

YMMV합니다.

관련 문제