2013-05-22 7 views
7

학교에서 올바르게 기억하면 "아직 구현되지 않았습니다"라는 용도로 사용되는 키워드가 있지만 코드가 컴파일됩니다. 나는 그것을 찾으려고 노력했지만 찾지 못했습니다. 어떤 사람이 내가 뭘 찾고 있는지 알아? 당신의 생각하는 bottom"작동하지 않음"haskell

바닥이라는 것이

isDivisor :: Integer -> Integer -> Bool 
isDivisor x y = None 
--isDivisor x y = (rem x y) == 0 
+1

'정의되지 않음'을 사용하십시오. 함수를 호출하면'Exception : Prelude.undefined'가됩니다. –

+1

또는'isDivisor x y = error "아직 구현되지 않았습니다.", 또는 ghci가 반복되도록하려면'isDivisor x y = isDivisor x y'입니다. –

답변

8

같은

이의 뭔가 그냥 구현되지 않은 뭔가를 보여주는 것이 아니라, 우리의 프로그램을 일으키는 계산을 대표하는 의미가 있어요 실패. 우리가 실제로 무한 루프로 자신을 undefined를 정의 할 수 있습니다 예를 들어

undefined = let x = x in x 
undefined = undefined 

그래서 정말 우리가 정당한 사유거나 프로그램이 충돌하거나 루프 영원히, 그러나 결코 어떤 값 undefined :: a에두고있다하고있는 그것을 평가.

당신이 방금이 typechecks 때문에이

foo :: Bar -> Baz -> Quux 
foo bar baz = foo bar baz 

을 할 수있는 구현하는 방법을 모르는 몇 가지 크고 복잡한 기능을 가지고 따라서 경우, 컴파일거야, 그리고 우리의 다른 부분을 테스트 할 수 있습니다 우리의 프로그램.

그러나 실수로 프로그램의 해당 부분을 실행할 때 무한 루프가 발생하는 것은 좋지 않으므로 GHC 및 다른 사람들은 undefined을 다르게 구현합니다.

-- In GHC 
error msg = throw (ErrorCall s) 
undefined = error "Prelude.undefined" 

그래서 더 나은 디버깅 기능은 하단 혼란, HAMMAR의 개념을 발견하는 경우

foo bar baz = undefined 
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz) 

로 정의되지 않은 함수를 떠나 : 그들은 그들 예를 들어, 프로그램을 중단하고 오류 메시지를 방출해야 위대한 게시 됨 answer