获取所有价值指数

时间:2014-05-11 18:04:34

标签: list haskell indexing

我试图创建一个haskell函数,其中列表中值的出现的所有索引都作为列表返回,所以像

indices 3 [1,2,3,3,7]

给出[2,3]作为输出。我是Haskell的新手,无法找到有用的东西。我尝试使用过滤器,但我所有工作的是获得[3,3]的列表,但不是实际的索引。如果你能给我一点提示,那会很酷。

1 个答案:

答案 0 :(得分:6)

这是函数式编程中非常常见的模式,有时也称为decorate-process-undecorate。我们的想法是,您希望将一些额外信息附加到列表中的每个元素,使用稍微改变的过滤器版本进行过滤,然后将这些额外信息删除。

indicies n = undecorate . filter predicate . decorate where
  decorate   = ...
  predicate  = ...
  undecodate = ...

尝试编码decorate时,我建议您查看函数zip

zip :: [a] -> [b] -> [(a, b)]

考虑它对无限列表的影响,例如repeat 1[1,3,...]。在尝试对undecorate进行编码时,您可能希望map

map :: (a -> b) -> [a] -> [b]

最后,不要担心这个过程的效率。在严格的语言中,decorate-filter-undecorate可能需要3次遍历列表。在像Haskell这样的非严格语言中,编译器会自动将3个内部循环合并为一个。