Итак, я работаю над задачей 31 .
Я написал следующую функцию в надежде определить, является ли число простым:
isPrime :: Integer -> Bool
isPrime x = prime x 2
where
prime :: Integer -> Integer -> Bool
prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1)
| ((y*y) >= x) = True
| otherwise = False
My Логика заключалась в том, чтобы создать функцию isPrime
и иметь функцию внутри n isPrime
вызвал prime
для хранения 2 параметров, числа, которое я хочу проверить, является ли оно простым ( x
), и итератор для проверки всех чисел ниже sqrt x и посмотреть, делят ли они x
.простое число
имеет 3 охранника:
| ((y*y) < x) and ((x `mod` y) == 0) = prime x (y+1)
Эта строка должна говорить: число, которое я передал, меньше квадратного корня из x ( ((y*y) ) и если это проверить, делится ли
x
на y
( ((x
mod y) /= 0)
), если это разве я не использую рекурсию и увеличиваю y, чтобы снова проверить с более высоким числом.
Эта строка:
| ((y*y) >= x) = True
Предполагается, что если все числа ниже квадратного корня никоим образом не делят x, то x должен быть простым.
Наконец, эта строка:
| otherwise = False
означает, что число где-то вдоль строки число делит x, поэтому оно не является простым.
Я думал, что код, который я написал, имеет смысл, я знаю, что он не самый эффективный, учитывая, что я мог просто проверять простые числа меньше sqrt x, а не все числа меньше sqrt x, но в любом случае у меня проблемы с этим утверждением. :
((y*y) < x)
GHCi говорит:
The function `(y * y) < x' is applied to two arguments, but its type `Bool' has none
Я думал, что должен принимать два аргумента и возвращать Bool, сообщение об ошибке на самом деле не имеет для меня смысла. Можете ли вы помочь мне понять, что я делаю неправильно? Спасибо.
Быстрое редактирование теперь, когда я запустил его, эта строка:
| ((y*y) >= x) = True
должна быть:
| ((y*y) > x) = True