Haskell过滤但保持过滤

时间:2014-02-27 20:55:31

标签: haskell

根据我的理解,Haskell filter函数filter a bs会过滤列表a中的所有bs

是否有filter的简单方法或变体可以反过来,只保留列表a中的bs,基本上创建a列表}的。

5 个答案:

答案 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])