2010-04-29 5 views
3

호출시 함수의 패턴 일치와 일치하지 않는 값이 런타임에 생성되면 GHCi가 더 나은 예외 메시지를 생성하도록 할 수 있습니까?비 포괄적 패턴에 대한 예외적 인 경우

현재 비 - 철저한 패턴 매치를 생성하는 함수의 줄 번호를 제공합니다. 때때로 도움이되지만 반복적으로 디버깅을해야합니다. 때때로 동일한 일련의 작업을 반복하고 있습니다. 그래서 해결책을 모으기 전에 뭔가 다른 것이 있는지 알고 싶었습니다.

줄 번호 이외에 어떤 종류의 전화를 걸 었는지 보여주는 예외 메시지는 무엇입니까?

이것도 가능합니까?

답변

9

ghci에서 경고를 켜 봅니다. 예를 들어 -W을 전달하여 ghc로 얻을 수있는 컴파일 시간 경고를 사용할 수 있습니다. 여러 가지 방법을 사용할 수 있습니다.

ghci -fwarn-incomplete-patterns 

또는 Neil Mitchell describes how he sets this up in his .ghci. 여기에 관련 발췌 한 것입니다 : 수동뿐만 아니라 ghci에서이 문제를 입력 할 수 있습니다

:set -fwarn-incomplete-patterns 

는하지만, 그래서 당신이 그것을 시작할 때마다 할 수있는 고통 일 것이다. 이 방법을 사용하면 프롬프트에 입력 된 명령문에 대해서만 작동하고 :l으로 파일을로드하지 않습니다. 대신 당신이 불완전한 패턴에 대해 경고 할 파일의 상단이 댓글을 넣을 수 있습니다 :

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-} 
+1

슬프게도 이것이 항상 내가 볼 수있는 한 경고하지는 않는다 ... 나는 방금 그것을 시험해 보았다. – toofarsideways

+1

분명히 이것은 ghc에 입력되고 파일에서로드되지 않은 명령문에만 적용됩니다. 나는 그것을 위해 일하기 위해 나의 대답을 업데이트했다. –

+0

감사합니다, 내가 필요한 것! – toofarsideways

2

나는이 질문에 대한 비 응답의 일이지만, 인식 내 인상입니다 베테랑 하스켈들 프로그래머들은 처음에는 경고가 아닌 오류를 생성하기 위해 -Werror을 사용할 때까지 비 - 철저한 패턴을 피해야한다는 일반적인 합의가 있습니다.

GHCi와 함께 작동하는 방법이 잘 모르겠는데, 특히 파일을로드하는 대신 프롬프트에서 함수를 작성하는 경우에 특히 유용합니다. 대화식으로 작업합니다. 그래도 적절한 명령 행 플래그로 GHCi를 실행하면 원하는 결과를 얻을 수 있습니다.

비 철저한 패턴에 대한보다 과감한 해결책을 원할 경우 항상 Catch을 현대 GHC 버전에서 사용할 수 있습니다. ㅎ.

그 외에도 일부 값으로 함수를 호출해서는 안되기 때문에 비 한정적인 패턴을 사용하는 경우 유효하지 않은 인수가있는 경우 누락 된 사례는 error $ "function foo called with ridiculous arguments " ++ show blahBlah과 같이 채울 수 있습니다 도움이됩니다. 또는 코드를 다시 작성하거나 더 특수화 된 데이터 유형을 정의하여 함수가 항상 맨 아래가 아닌 인수로 현명한 것을 할 수 있도록 할 수 있습니다.

그렇지 않으면 어색한 디버깅이 필요합니다.

+0

좋은 지적입니다. 제가 그 규칙을 따를 수있을 지 의심 스럽지만 곧 리팩토링 세션을 시작할 예정입니다. 그래서 리핑 세션을 시작하고 곧 나오는 모든 것을 고칠 예정입니다. 쇼 팁을 가져 주셔서 감사합니다. 이런 식으로 오류를 구조화 할 수 있는지 몰랐습니다. 나는 그 스타일이 사용되는 것을 보지 못했기 때문에 유용한 오류가 있다는 것을 비웃고있었습니다. "함수 foo에서 배 포기" – toofarsideways

+0

@toofarsideways :'error'는 오류 메시지에 임의의'String'을 사용하는 함수입니다. 문자열을 만들려는 모든 작업을 수행 할 수 있습니다. 'Debug.trace' 모듈을 아직 보지 않았다면 Haskell 버전의 구식 "printf 디버깅"을 빠르고 더러운 버전으로 볼 수 있습니다. 지금까지'error'를 사용하는 것은 프로덕션 코드에 나쁜 스타일 이었지만 개발/테스트에서는 괜찮습니다. –

+0

고맙습니다. 가치가 있습니다. :). 나는 그 일을하는 방법에 대해 내 머리를 긁적 거렸다. – toofarsideways

관련 문제