2011-12-23 6 views
2

방금 ​​haskell을 배우기 시작했고, 숫자가 제곱근인지를 검사하는 간단한 함수를 구현하려고 시도했다. 하스켈 형식 시스템을 이해하는 데 몇 가지 문제가 있다고 생각합니다. 내 유일한 다른 프로그래밍 경험은 루비와 자바입니다. 이것은 내가 지금까지 한 것입니다 (죄송 경우는 정말 바보) :Haskell 완벽한 사각형 찾기 - 타입 에러를 얻는다

isPerfectSquare :: (RealFloat t) => t -> Bool 
isPerfectSquare n = 
    (sqrt n) == (truncate (sqrt n)) 

이 내가 루비에서하는 것입니다 ...하지만 여기 나에게이 오류 제공 :

Could not deduce (Integral t) arising from a use of `truncate' 
from the context (RealFloat t) 
    bound by the type signature for 
      isPerfectSquare :: RealFloat t => t -> Bool 
    at more.hs:(73,1)-(74,35) 
Possible fix: 
    add (Integral t) to the context of 
    the type signature for isPerfectSquare :: RealFloat t => t -> Bool 
In the second argument of `(==)', namely `(truncate (sqrt n))' 
In the expression: (sqrt n) == (truncate (sqrt n)) 
In an equation for `isPerfectSquare': 
    isPerfectSquare n = (sqrt n) == (truncate (sqrt n)) 
Failed, modules loaded: none. 

당신이 수를 문제가 무엇인지, 문제를 해결하는 방법, 그리고 이해가되지 않는 기본 개념을 설명해주십시오. 미리 감사드립니다. 잘라야는 정수를 반환하는 동안 즉

truncate :: (RealFrac a, Integral b) => a -> b 

는, SQRT는, 부동 소수점 숫자를 반환

sqrt :: Floating a => a -> a 

잘라 내기 유형이 있습니다

답변

5

SQRT는 유형이 있습니다. 명시 적 변환을 삽입해야합니다. 그런 다음 비교를 할 수

fromIntegral :: (Num b, Integral a) => a -> b 

:이 경우, 당신은 아마 모든 숫자 유형 모든 정수 계열 형식을 변환 할 수 있습니다 fromIntegral, 원하는

(sqrt n) == (fromIntegral $ truncate (sqrt n)) 
+0

덕분에,이 내가 찾던 정확히 무엇인가 ! 나는 배울 것이 많다고 생각합니다. – V9801

관련 문제