Python的enumerate在列表上可以写成 zip [0..]
.我查看了 Control.Lens.Traversal 和 Control.Lens.Indexed,但我无法弄清楚如何使用镜头将其推广到任何合理的容器(我犹豫地说“可穿越”)。
我猜 itraverse
或 itraverseOf
是关键。
最佳答案
如果您使用的容器是 FunctorWithIndex
的实例那么你可以简单地使用 imap (,)
:
> imap (,) "abc"
[(0,'a'),(1,'b'),(2,'c')]
但如果索引不是位置,这将不起作用:
> let m = Map.fromList [('a', "foo"), ('b', "bar"), ('c', "foobar")])
> imap (,) m
fromList [('a',('a',"foo")),('b',('b',"bar")),('c',('c',"foobar"))]
相反,您可以使用
traversed
,这是一个索引遍历,其中索引是元素出现的顺序。这可以用于任何 Traversable
.而不是 imap
使用 iover traversed
(与 imapOf
相同,但已被弃用):> iover traversed (,) "abc"
[(0,'a'),(1,'b'),(2,'c')]
> iover traversed (,) m
fromList [('a',(0,"foo")),('b',(1,"bar")),('c',(2,"foobar"))]
关于haskell - 我将如何在 Haskell 中使用 lens 来复制 Python 的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29125149/