Ошибка типа GHC, которую я не понимаю
Вопрос
Я учу себя, Хаскелл.
Я хочу написать функцию, которая рекурсивно находит первое число, которое имеет корень целочисленного квадрата и меньше, чем стартовый номер.
Похоже:
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 как Инт, Поэтому мне нужно было добавить от интеграла к призывам к SQRT, чтобы они работали.
Изменение средней гвардии на следующее помогло:
| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x