我有兴趣创建一个过滤器,其条件取决于输入列表。具体来说,我想定义过滤器,以便检查数字是否可以被输入列表中的任何数字整除。因此对于单个元素:
my_filter a = filter (\x -> x `mod` a == 0)
基本上我想扩展它,如果我有一个输入列表,它将执行以下操作:
my_filter [a,b] = filter (\x -> x `mod` a == 0 || x `mod` b == 0)
如何递归定义此过滤器,以便列表的每个元素都创建一个新条件?
答案 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)
这些是等效的功能,只是一种不同的风格。