2017-01-11 3 views
1

Я заинтересован в создании фильтра, условия которого зависят от списка ввода. В частности, я хочу определить фильтр таким образом, чтобы он проверял, является ли число делимым на любое число в моем списке ввода. Таким образом, для одного элемента, который был бы:Создание условий фильтра на основе элементов списка

my_filter a = filter (\x -> x `mod` a == 0) 

в основном я хочу продлить это такое, что если у меня есть список ввода, это будет сделать следующее:

my_filter [a,b] = filter (\x -> x `mod` a == 0 || x `mod` b == 0) 

Как определить этот фильтр рекурсивно, так что каждый элемент списка создает новое условие?

ответ

3

Что вы ищете является or функция:

my_filter divisors = filter (\x -> or $ map ((0 ==) . (x `mod`)) divisors) 

Если вы хотите отфильтровать, где все значения были делители, то вы просто должны изменить or к and.

Другой способ сделать это было бы

my_filter divisors = filter (\x -> any (== 0) $ map (x `mod`) divisors) 

Эти эквивалентные функции, просто немного другой стиль.

+6

Функция 'any' была написана именно для того, чтобы обернуть эту комбинацию' или '/' map'! Вам просто нужно отправиться на целый свиньи вместо того, чтобы поместить половину «карты» в это условие, как вы это делали: '' 'any (\ d -> x' mod' d == 0) '' '. –

Смежные вопросы