根据列表元素创建过滤条件

时间:2017-01-11 16:25:03

标签: haskell functional-programming

我有兴趣创建一个过滤器,其条件取决于输入列表。具体来说,我想定义过滤器,以便检查数字是否可以被输入列表中的任何数字整除。因此对于单个元素:

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

基本上我想扩展它,如果我有一个输入列表,它将执行以下操作:

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

如何递归定义此过滤器,以便列表的每个元素都创建一个新条件?

1 个答案:

答案 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)

这些是等效的功能,只是一种不同的风格。