我有[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]
我有[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]
假设这是从 转换为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]
cond :: a -> Bool
仅使用函数filter
(即使用(filter cond) [1..10]
yielding )是不可能做到这一点的[1,2]
。
问题是只filter
查看数组中的每个元素一次,并且您没有关于先前元素的信息。