2013-07-08 3 views
0
나는이 하스켈 기능에 홀수 검사를 수행하고 그것이 오류를 반환 음수에 관해서는 양수 작업 않지만 된

..기능 프로그래밍 : 홀수 체크

myodd :: Integer -> Bool 
myodd = rem n 2 == 1 

내가 생각 나는이 같은 .. 어딘가에 복근을 배치하면 작동합니다 :

myodd :: Integer -> Bool 
myodd = rem (abs(n)) 2 == 1 

하지만 음수를 배치 할 때 난 여전히 오류가 나는 내가 할 수있는 다른 모르겠어요 ..

을 ... 뉴욕 아이디어는 매우 높이 평가 될 것입니다 :)

+1

오류 메시지가 무엇인가요? –

+2

실제 코드를 게시하십시오. 게시 한 코드는 컴파일되지 않으므로 양수 또는 음수로 작동하지 않습니다. – interjay

+0

편집 후에도 코드가 컴파일되지 않습니다. 게시하기 전에 코드를 테스트하십시오! 그리고 여전히 오류 메시지를 게시하지 않았습니다. 내가 줄 -1 다음과 같은 오류를 반환 – interjay

답변

3

작성한대로 코드는 컴파일되지 않습니다. ::에는 형식이 아닌 표현식이 와야하고 (어쨌든 앞 줄에 형식 서명을 부여 했으므로) myodd :: rem (abs(n)) 2 == 1은 유효한 구문이 아니며 어느 것도 myodd :: rem n 2 == 1이 아닙니다. myodd을 정의하려면 =를 사용해야하고 본문에 n를 사용하기 때문에 당신은 그것을 n라는 이름의 매개 변수를 제공해야합니다 :

myodd :: Integer -> Bool 
myodd n = rem (abs(n)) 2 == 1 

지금이 코드를 컴파일하고 사용자가 원하는 정확히처럼 작동합니다. 음수로 호출하면 런타임 오류가 발생하지 않습니다.

+0

아 맞아, 내가 컴파일 오류를보고 싶었어. – bennofs

+0

@ sepp2k 두 번째 줄을 잘못 입력 한 것은 유감입니다. 귀하의 것과 똑같이 써야합니다. – nubz0r

4

rem 함수는 결과의 부호를 변경하지 않으므로 음수로 시작하면 음수를 다시 얻습니다. 양수 만 얻으려면 수학 함수를 사용하여 수학적으로 올바른 모듈을 계산하십시오.

>>> (-3) `rem` 4 
-3 
>>> (-3) `mod` 4 
1 
+0

사실이지만, OP의 'abs'사용법은 완벽하게 잘 작동합니다. – sepp2k

5

결과가 0이 아닌지 확인할 수 있습니다 (대신 1 인 경우).

myodd :: Integer -> Bool 
myodd n = n `rem` 2 /= 0 
+0

그러나 haskell에서! =은/ – bennofs

+1

이라고 부릅니다. 이것은 적어도 나를 위해 끊임없는 성가심의 원천입니다. – Ingo

+0

@Ingo 짜증나지 말고 언어를 수정하십시오! 'infix 4! ='와'x! = y = x/= y'를 쓰는 것의 꼭대기에 두지 않으시겠습니까? – AndrewC