Условие x `mod` y == 0 for y in [2, 3 .. floor x^0.5]
синтаксически недопустимо в Haskell. Например, в Haskell нет ключевого слова for
. Более того, даже в Python вышеприведенное не будет работать, так как тогда вы создаете генератор .
. Вы можете использовать all :: Foldable f => (a -> Bool) -> f a -> Bool
проверить, не является ли x
делимым на все значения в списке. Затем этот список является списком [ 2 .. √x ]
.
Работа с (^) :: (Num a, Integral b) => a -> b -> a
не будет работать, поскольку показатель степени должен иметь тип, который является членомкласс Integral
. Если мы используем (**) :: Floating a => a -> a -> a
, первый операнд должен иметь тип, который является членом класса типов Floating
. Мы можем преобразовать Int
s в Float
, но это обычно не очень безопасно, поскольку возможны ошибки округления.
Поэтому может быть лучше использовать takeWhile :: (a -> Bool) -> [a] -> [a]
для элементов, пока выполняется определенное условие. Таким образом, мы можем здесь проверить с помощью:
Prelude> takeWhile (\y -> y*y <= 20) [2 ..]
[2,3,4]
Таким образом, мы можем реализовать простую проверку как:
isPrime :: Int -> Bool
isPrime x
| x <= 1 = False
| otherwise = all ((/=) 0 . mod x) (takeWhile (\y -> y*y <= x) [2 .. ])