문제

나는 나 자신에게 Haskell을 가르치고있다.

정수 제곱근이 있고 시작 번호보다 작은 첫 번째 숫자를 재귀 적으로 찾는 함수를 작성하고 싶습니다.

다음과 같이 보입니다.

findFirstSquare :: Int -> Int
findFirstSquare x
    | x <= 0                                  = error "This function only works for 1 or above"
    | fromInteger(floor(sqrt(x))) == (sqrt x) = x
    | otherwise                               = intSqrt(x - 1)

그러나 GHC는 다음과 같이 불평합니다.

'바닥'을 사용하여 발생하는 (realfrac int)에 대한 인스턴스는 ...

그러나 다음을 GHCI에 입력하면 행복하게 컴파일합니다.

 fromInteger(floor(sqrt(4))) == (sqrt 4)

내 질문은 : GHCI에서 성공적으로 컴파일하는 표현식에서 유형 오류를받는 이유는 무엇입니까?

도움이 되었습니까?

해결책

좋아, 나는 그것을 알아 냈다.

차이점은 상수 "4"가 과부하되므로 대화식으로 SQRT (4)가 뜨다 4

그러나 내 함수는 x를 an으로 선언합니다 int, 따라서 SQRT에 대한 호출에 a FromIntegral을 추가하여 작동하도록해야했습니다.

중간 가드를 다음으로 변경했습니다.

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top