Функция `(y * y) < x' применяется к двум аргументам, но его тип `Bool' не имеет ни одного

Итак, я работаю над задачей 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( ((xmod 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

5
задан dave4420 16 March 2012 в 08:49
поделиться