Я не понимаю преобразования чисел в Haskell

Вот что я пытаюсь сделать:

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 в реальное (почему?).

Мне не нужен метод для проверки простоты, я хочу понять, как чтобы исправить это. Почему это так сложно?

12
задан David Matuszek 9 August 2011 в 19:54
поделиться