Вопрос

Я учу себя, Хаскелл.

Я хочу написать функцию, которая рекурсивно находит первое число, которое имеет корень целочисленного квадрата и меньше, чем стартовый номер.

Похоже:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top