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

标签 haskell

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

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/

相关文章:

c++ - Maybe 和 Either 单子(monad)、短路和性能

algorithm - 如何使用值对列表 [MVar a] 进行排序?

haskell - 让 Haskell 类型系统理解fundeps继承了复合(类似元组)类型

Haskell:函数组合刚刚损坏了我的大脑

haskell - Haskell Servant从处理程序获取当前路由/URL

haskell - 如何使用 hsc2hs 绑定(bind)常量、函数和数据结构?

mysql - 这是 "undefined"的合法使用还是有更好的方法?

haskell - 这个简单的类型定义有什么问题? (期待更多的论点......)

haskell - 在 Haskell 中处理全局标志的正确方法

haskell - 如何在 Dhall 中定义和使用类似 Haskell 的 sum 类型