我试图创建一个haskell函数,其中列表中值的出现的所有索引都作为列表返回,所以像
indices 3 [1,2,3,3,7]
给出[2,3]作为输出。我是Haskell的新手,无法找到有用的东西。我尝试使用过滤器,但我所有工作的是获得[3,3]的列表,但不是实际的索引。如果你能给我一点提示,那会很酷。
答案 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个内部循环合并为一个。