list - 通过过滤器列表过滤元素列表

标签 list haskell filtering

我在想我怎样才能做到,如果我有一个元素列表 [1, 2, ... n] ,以及过滤器列表,例如 [(>3), (<4), ...] ,它将返回通过每个过滤器的元素列表。

已经尝试了一段时间,到目前为止我得到的是:

filt :: (a -> Bool) -> [a] -> [a]
filt f xs = filter f xs

这个函数应该得到一个过滤器和一个元素列表,并返回通过一个过滤器的元素列表。

然后,

filters :: [a] -> ([a] -> Bool) -> [a]
filters xs ps = (\p -> filt p xs) ps

这不仅给我错误,而且我也不知道我是否做对了。 (我试图让过滤器列表的每个过滤器成为 filt 函数的参数,以及元素列表。

Haskell 的新手,所以非常感谢你们给我的任何提示和技巧!

最佳答案

and a list of filters such as [(>3), (<4), ...]

签名不正确。这是函数列表 a -> Bool , 所以你应该使用:

filters :: [a] -> <b>[a -> Bool]</b> -> [a]

但这还不够。您需要将它变成一个过滤器,检查是否满足所有谓词。我们可以使用 all :: Foldable f => (b -> Bool) -> f b -> Bool 来做.这里是b对于 all函数是一个函数a -> Bool ,因此函数的类型 (b -> Bool)(a -> Bool) -> Bool .我们通过调用该元素上的每个函数来做到这一点:

filters :: [a] -> [a -> Bool] -> [a]
filters xs fs = filter (\x -> <b>all ($ x)</b> fs) xs

我们可以进一步将签名概括为:

filters :: Foldable f => [a] -> f (a -> Bool) -> [a]
filters xs fs = filter (\x -> <b>all ($ x)</b> fs) xs

关于list - 通过过滤器列表过滤元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64615223/

相关文章:

c# - 将 List<int> 转换为范围列表

list - 将属性和值收集到字符串列表中

haskell - Haskell 函数中的非详尽模式

haskell - Haskell 中的分解守卫

c - C 语言中的 FIR 滤波器?

ios - 在 Swift 中对字典使用过滤器

C# 找不到类型或命名空间名称 `List'。但我正在导入 System.Collections.Generic;

Python将多个变量分配给相同的值?列出行为

haskell - Haskell 运算符 "<>"的含义是什么?

ios - indexOfObjectsPassingTest 或 filteredArrayUsingPredicate 哪个性能更快?