代码之家  ›  专栏  ›  技术社区  ›  user2693928

Haskell按列表索引筛选

  •  1
  • user2693928  · 技术社区  · 6 年前

    isEven n = (mod n 2) == 0
    

    filter isEven [1, 2, 3, 4 ,5 ,6] -- -> 2, 4, 6
    

    到现在为止,一直都还不错。

    我的问题是:函数中是否有我可以按列表索引过滤的地方(您可以想象js filter,其中第二个参数是索引)。

    如果没有,有什么理由不包括这一点,我如何才能在一个良好的哈斯克尔方式呢?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jonas Duregård    6 年前

    如果希望函数同时对值和索引进行过滤,可以这样编写:

    filterIndexed :: (a -> Int -> Bool) -> [a] -> [a]
    filterIndexed p xs = [x|(x,i) <- zip xs [0..], p x i]
    

    它使用了一个列表理解,这对于这类事情(过滤器和项目)是很好的。标准库中没有这样做的原因是,这是一个相对少见的操作,而且直接在代码中理解列表相当容易。

    推荐文章