2017-12-17 15 views
0

나는 하스켈을 배우려고하고 있는데, 나는 계승을 계산하기 위해 다음과 같은 간단한 재귀 함수를 정의했다.기능이 소수에 적용될 때 음수에 대해 지정된 오류가 지정되었습니다. 왜?

fact n | n < 0 = error "fact only valid for non-negative integers" 
     | n == 0 = 1 
     | n > 0 = n * fact(n-1) 

양의 정수에는 정상적으로 작동하고 음수로 호출하면 예상대로 오류가 발생합니다.

무엇이 문제인가? : fact 10.5과 같이 분수에 적용하려고하면 동일한 오류 ("음수가 아닌 정수에만 유효합니다")가 표시됩니다. 왜 내가 분명히 지정한 같은 오류가 n <의 경우에만 적용되어야하는지 알려줍니다.

답변

5

인수로 10.5를 지정하면 세 번째 대소 문자가 유효하며이 함수는 다음과 같이 재귀 적으로 호출합니다. n = 10.5 - 1 = 9.5.

또한이 입력은 세 번째 경우를 트리거하여 n = 8.5과 함께 재귀 호출을합니다.

등등

: 7.5 다음 6.5 후 5.5, 4.5, 3.5, 2.5, 1.5, 0.5

그리고, 첫 번째 경우를 트리거하고, 오류가 발생 다음 반복, n = -0.5에. 모든 것이 정확히 코딩되었습니다.

함수가 소수로 작동하게하려면 0 < n < 1에 대해 n의 계승을 정의한 다음 (b) 해당 사례를 인코딩해야합니다. I 한 동일하게 0과 1 사이의 수의 계승을 정의한다면

예를 들어, 그 기능은 다음과 같을 것이다 : 또한

fact n | n < 0 = error "fact only valid for non-negative integers" 
     | n >= 0 && n <= 1 = 1 
     | n > 0 = n * fact(n-1) 

, 사이드 주 : I는 생각 위의 코드는 함수가 부분적이라는 경고를 제공합니다. 이것은 컴파일러가 케이스 중 하나가 항상 유지되어야한다는 것을 증명할 수 없기 때문입니다 (그리고 인수 유형과 정의에 따라 NumOrd의 정의에 따라 유지 될 수 없음). 이를 방지하려면 otherwise 조항을 사용해야합니다.

+0

감사합니다. 물론 그것은 의미가 있습니다. 나는 이것을 알아 내야했다. 그렇게 할 수있게되면 대답을 받아 들일 것입니다. – Curious2learn