Вот что я пытаюсь сделать:
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 в реальный (почему?).
Мне не нужен метод проверки примитивности, я хочу понять, как это исправить. Почему это так сложно?