获取所有价值指数

Cro*_*mon 1 indexing haskell list

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

indices 3 [1,2,3,3,7]
Run Code Online (Sandbox Code Playgroud)

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

J. *_*son 6

这是函数式编程中非常常见的模式,有时称为decorate-process-undecorate.这个想法是你想要为列表中的每个元素附加一些额外的信息,使用你通常会做的过滤器的略微改变的版本进行过滤,然后去掉那些额外的信息.

indicies n = undecorate . filter predicate . decorate where
  decorate   = ...
  predicate  = ...
  undecodate = ...
Run Code Online (Sandbox Code Playgroud)

在尝试编码时decorate我建议看一下这个函数zip:

zip :: [a] -> [b] -> [(a, b)]
Run Code Online (Sandbox Code Playgroud)

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

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

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

  • 我用你的方法得到了以下代码,它完全符合我的要求!`print(map(fst)(filter(\(x,y) - > y == 3)(zip [1 ..] [1,3,3,7])))` (2认同)