Haskell:使用规则列表过滤列表

con*_*ode 3 haskell

所以我有一个项目列表(食谱),我想根据规则集过滤,

ruleset = [rule0, rule1, rule2, rule3, rule4]
Run Code Online (Sandbox Code Playgroud)

每个规则都是一个函数:: Recipe - > Bool.我想将这些规则应用于列表中的每个项目,我一直在使用以下函数:

testRules :: Recipe -> Bool
testRules r = rule0 r && rule1 r && rule2 r && rule3 r && rule4 r
Run Code Online (Sandbox Code Playgroud)

必须有一种方法来应用数组而不明确说"rule0 && rule1 && ..."

有谁知道吗?我知道'map'将一个函数应用于列表..而zipWith将数组乘以数组..必须有另一个函数来执行此任务!

我一直在想,也许我可以将规则集作为参数传递给testRules并递归地遍历规则集:

testRules (rule:rules) r = rule r && testRules rules
testRules [] r = True
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何提供函数的头部(testRules ::)

欢呼任何帮助!

yat*_*975 11

还有all :: (a -> Bool) -> [a] -> Bool可以使用的功能.此函数检查谓词是否适用于列表的所有值.

只是到了现在,我们将稍微改变一下,让谓词'是这个规则的结果,当它应用于x'时,列表将包含谓词.

您可以将谓词表达为\rule -> rule x == True但是与谓词相同\rule -> rule x,与之\rule -> rule $ x相同($x).所以这一思路给了我们好的和简短的:

testRules :: [a -> Bool] -> a -> Bool
testRules rules x = all ($x) rules
Run Code Online (Sandbox Code Playgroud)

testRules = flip (all . flip ($))我认为,这可以通过使用来实现无意义,但这有点过头了.