所以我有一个我想根据规则集过滤的项目(食谱)列表,
ruleset = [rule0, rule1, rule2, rule3, rule4]
其中每个规则都是一个函数::Recipe -> Bool。我想将这些规则应用于列表中的每个项目,并且我一直在使用以下函数:
testRules :: Recipe -> Bool
testRules r = rule0 r && rule1 r && rule2 r && rule3 r && rule4 r
必须有一种方法可以在不明确说“rule0 && rule1&& ...”的情况下应用数组
有人知道方法吗?我知道 'map' 将一个函数应用于一个列表.. zipWith 将一个数组乘以一个数组.. 必须有另一个函数来执行这个任务!
我也一直在想,也许我可以将规则集作为参数传递给 testRules 并递归地遍历规则集:
testRules (rule:rules) r = rule r && testRules rules
testRules [] r = True
但是,我不知道如何提供函数的头部(testRules::)
为任何帮助干杯!
最佳答案
还有功能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
这可以通过使用
testRules = flip (all . flip ($))
来实现。但我认为这有点过分了。
关于Haskell:使用规则列表过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12803934/