我在想我怎样才能做到,如果我有一个元素列表 [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/