我该如何过滤此列表?

时间:2012-08-13 10:04:34

标签: haskell

我有[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]

2 个答案:

答案 0 :(得分:9)

假设f是从a转换为b的函数。然后,您可以分三步进行操作:

  1. 您将列表中的每个元素与f下的图片配对:map (id &&& f);
  2. 您删除了第二个元素已经出现在现在获得的列表中的每一对:nubBy (on (==) snd);
  3. 删除每对中的第二个组件:map fst
  4. 因此:

    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只查看数组中的每个元素一次,而且您没有关于以前元素的信息。

相关问题