Виновник в последней части:
take 5 [x | x <- [0..], odd x == False, x > 0, x `mod` 13 == 3, x `mod` 20]
-- ^^^^^^^^^^
Здесь Haskell ожидает, что вы напишите фильтр, но x `mod` 20
- это , а не - фильтр: он делает не return a Bool
, x `mod` 20
возвращает тот же тип номера, что и сам x
.
Исходя из вашего вопроса, вы хотите, чтобы это было пять, поэтому можете решить его с помощью:
take 5 [x | x <- [0..], odd x == False, x > 0, x `mod` 13 == 3, x `mod` 20 == 5]
-- ^^^^^^^^^^^^^^^
Но здесь есть и другие проблемы:
- вы написали "неровно", поэтому проверка
odd x
должна быть True
; x > 0
всегда может быть True
, поскольку мы ограничиваем итератор от x
до [1..]
; - мы можем объединить
x <- [1..]
и odd x
в [1, 3..]
;
Это приводит к:
take 5 [x | x <- [1, 3..], x `mod` 13 == 3, x `mod` 20 == 5]
Тем не менее нам все равно не нужна вся эта проверка по модулю: мы можем сначала вычислить наименьшее общее кратное из 2
(нечетное ограничение), 20
и 13
, что составляет 260
, в результате мы знаем, что числа в результате принимают "прыжки", равные 260.
Мы также знаем, что первый результат равен 185
, поэтомуэто может бытьзаписано:
take 5 [185, 445 ..]