根据我的理解,Haskell filter
函数filter a bs
会过滤列表a
中的所有bs
。
是否有filter
的简单方法或变体可以反过来,只保留列表a
中的bs
,基本上创建a
列表}的。
答案 0 :(得分:8)
嗯,无论如何,这是不准确的措辞。签名是
filter :: (a -> Bool) -> [a] -> [a]
所以filter a bs
被描述为过滤来自bs
履行 a
的所有元素。
所以要“反过来”,你只需要反转谓词。例如,
前奏>过滤器(=='a')“是否有简单的方法或过滤器的变体” “AAAA”
前奏>过滤器(/ ='a')“是否有简单的方法或过滤器的变体” “过滤器是否有简单的方法或过程”
一般来说:
filterNot :: (a -> Bool) -> [a] -> [a]
filterNot pred = filter $ not . pred
前奏> filterNot(=='a')“是否有简单的方法或过滤器的变体” “过滤器是否有简单的方法或过程”
答案 1 :(得分:1)
filter :: (a -> Bool) -> [a] -> [a]
> filter (<5) [1 .. 10]
[1,2,3,4]
它过滤了一些满足某些条件的元素
相反的函数是具有负布尔条件的相同函数
filterNot f = filter (not . f)
> filterNot (<5) [1 .. 10]
[5,6,7,8,9,10]
答案 2 :(得分:1)
remove f = filter (not . f)
> remove odd [1..10]
[2,4,6,8,10]
答案 3 :(得分:0)
filter
函数采用类型a -> Bool
的谓词函数和类型[a]
的列表,并将谓词应用于列表的每个元素以确定它是否应该是保持。例如,您可以执行filter (\x -> x < 2 || x > 10) someNumbers
,这将返回someNumbers
中小于2或大于10的所有值的列表。
如果您想要列表中的所有特定元素,则可以执行
only :: Eq a => a -> [a] -> [a]
only x xs = filter (== x) xs
因为谓词正在检查每个元素是否等于特定元素。
答案 4 :(得分:0)
或者,是什么引导我进入这个页面,一种既能保持一个又一个又一个但又分开的方式:
> foldl (\(evens,odds) e -> if e `mod` 2 == 0 then (e:evens, odds) else (evens, e:odds)) ([],[]) (reverse [1..10])
([2,4,6],[1,3,5,7,9])