gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:59:27 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com