2014-12-17 3 views
0

저는 haskell을 처음 접했고 유형 서명에 어려움을 겪었습니다. 저는 단일 함수 Collatz 체인 생성기를 개발 중입니다. 저는 몇 가지 haskell collatz 질문을 보았습니다. 그러나 제가 대답하려고하는 종류의 문제에 대한 답을 보지 못했습니다. GHCI를 사용하고 있습니다.단일 기능 콜라주 체인의 서명 유형

collatz :: (Num a) => a -> [a] 
collatz n 
    | n == 1 = [n] 
    | odd n = n : collatz (n * 3 + 1) 
    | even n = n : collatz (n/2) 

이 간단합니다 보인다; 여기

내 기능입니다 목록에 새로운 변형을 추가해야합니다. 그러나, 인터프리터는 나에게 이러한 오류를 제공합니다

collatz.hs:9:13: 
    Could not deduce (Eq a) arising from a use of `==' 
    from the context (Num a) 
.... 
collatz.hs:10:11: 
    Could not deduce (Integral a) arising from a use of `odd' 
    from the context (Num a) 
.... 
collatz.hs:11:36: 
    Could not deduce (Fractional a) arising from a use of `/' 
    from the context (Num a) 

컴파일러가 나를 사용하는 지시 형 타입의 서명의 모든 조합 내가 분명히 근본적인 뭔가를 누락

collatz :: (Eq a, Num a) => a -> [a] 
collatz :: (Integral a) => a -> [a] 
collatz :: (Fractional a) => a -> [a] 

실패 것으로 보인다. 누구든지 단일 기능으로 collatz 체인을 생산하는 방법을 말해 줄 수 있습니까? 문제는

+0

종종 디버그 유형 오류에 구체적인 유형을 사용하는 것이 도움이 될 것입니다. 'a'를'Int'로 바꾸면 훨씬 간단한 메시지로 문제를 더욱 분명하게 할 수 있습니다. – ErikR

답변

3

, (/), 플로트 같은 반면, evenodd는 미적분학은 .... 기본적으로, evenodd의 개념 (ie- 홀수 1.5도이다 fractionals으로 이해가되지 않는 소수해야 할 필요가 ?).

두 번째 경우에도 n이 깁니다. 따라서 (/)quot으로 대체하면 문제를 해결할 수 있습니다.

유형은

collatz :: Integral a => a -> [a] 
+0

... 그리고 EQ 제약 조건을 완화하거나 명시 적으로 추가하려면 == 0 대신 패턴 일치를 사용해야합니다. – AndrewC

+0

@ 앤드류 C- 나는 또한 생각했을 것이다. 그러나 ghc는 의견이 맞지 않는다. ... "Integral a"로 충분할 것 같다. 나는 혼란 스럽다는 것을 인정해야한다. 그러나 나는 'Integral a'가'Eq a'를 함축해야한다고 생각하고있다. – jamshidh

+0

@ AndrewC- 예, 문서를보고 Integral은 Num, Num은 Ord가 필요하고 Ord는 Equq가 필요합니다 ..... – jamshidh