我有[a]
可以转换为[b]
。每个a
都是不同的,但每个b
可能不同。我希望过滤我的[a]
,条件是过滤后的[a]
在转换为[b]
时不包含重复项。
有人可以帮助我实现这个目标吗?
修改
为了提供帮助,我将提供一个例子。
as = [1..10]
conv = even
bs = map even as
-- bs = [False,True,False,True,False,True,False,True,False,True]
-- filter <cond> as -- [1,2]
答案 0 :(得分:9)
假设f
是从a
转换为b
的函数。然后,您可以分三步进行操作:
f
下的图片配对:map (id &&& f)
; nubBy (on (==) snd)
; map fst
。因此:
import Control.Arrow ((&&&))
import Data.Function (on)
import Data.List (nubBy)
filterOn :: Eq b => (a -> b) -> [a] -> [a]
filterOn f = map fst . nubBy ((==) `on` snd) . map (id &&& f)
例如:
> filterOn even [1 .. 10]
[1,2]
答案 1 :(得分:1)
使用cond :: a -> Bool
函数并且仅filter
,即使(filter cond) [1..10]
屈服[1,2]
,就无法做到这一点。
问题是filter
只查看数组中的每个元素一次,而且您没有关于以前元素的信息。