这是函数式编程中非常常见的模式,有时称为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个内部循环合并为单个循环.