문제
나는 나 자신에게 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
제휴하지 않습니다 StackOverflow