Вот что я пытаюсь сделать:
isPrime :: Int -> Bool
isPrime x = all (\y -> x `mod` y /= 0) [3, 5..floor(sqrt x)]
(Я знаю, что не проверяю деление на два - пожалуйста, не обращайте на это внимания.) Вот что я получаю:
No instance for (Floating Int)
arising from a use of `sqrt'
Possible fix: add an instance declaration for (Floating Int)
In the first argument of `floor', namely `(sqrt x)'
In the expression: floor (sqrt x)
In the second argument of `all', namely `[3, 5 .. floor (sqrt x)]'
Я потратил буквально часы, пытаясь все, что мог придумать, чтобы составить этот список, используя какой-нибудь вариант sqrt, включая чушь вроде
intSqrt :: Int -> Int
intSqrt x = floor (sqrt (x + 0.0))
Кажется, (sqrt 500) работает нормально, но (sqrt x) настаивает на том, чтобы x был плавающим (почему?), и нет функции, которую я могу найти для преобразования Int в реальное (почему?).
Мне не нужен метод для проверки простоты, я хочу понять, как чтобы исправить это. Почему это так сложно?