C 및 Java 배경에서 하스켈을 처음 사용했습니다. 때때로, 나는 하스켈의 타입 시스템에 문제가있다. 나의 현재 오류가이 코드 조각입니다 :let 바인딩의 모호한 유형 변수
는countIf :: (Integral b) => [a] -> (a -> Bool) -> b
countIf [] p = 0
countIf (x:xs) p
| p x = 1 + countIf xs p
| otherwise = countIf xs p
isRelativelyPrime :: (Integral a) => a -> a -> Bool
isRelativelyPrime m n = gcd m n == 1
phi :: (Integral a, Integral b) => a -> b
phi n = countIf [1..(n - 1)] (isRelativelyPrime n)
main = print [(n, phi n, ratio) | n <- [1..10], let ratio = (fromIntegral (phi n))/n]
오류 메시지가
prog.hs:13:60:
Ambiguous type variable `b' in the constraints:
`Fractional b' arising from a use of `/' at prog.hs:13:60-85
`Integral b' arising from a use of `phi' at prog.hs:13:75-79
Probable fix: add a type signature that fixes these type variable(s)
13:60 그냥 메인에 내 지능형리스트에 바인딩하자에 fromIntegral의 사용 전입니다. ghc의 오류 메시지에 익숙해 지려고합니다. 컴파일 할 코드를 변경하기 위해 필요한 것을 알아 내기 위해이 특정 코드를 해독 할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사.
'countIf'는 표준 함수의 조합으로 정의 될 수 있습니다 :'countIf = length. 플립 필터 '. – demi