haskell - 我将如何在 Haskell 中使用 lens 来复制 Python 的枚举?

标签 haskell haskell-lens

Python的enumerate在列表上可以写成 zip [0..] .我查看了 Control.Lens.Traversal 和 Control.Lens.Indexed,但我无法弄清楚如何使用镜头将其推广到任何合理的容器(我犹豫地说“可穿越”)。

我猜 itraverseitraverseOf是关键。

最佳答案

如果您使用的容器是 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/

相关文章:

json - 使用lens-aeson解析json

haskell - 在操作不可变数据结构时,Clojure assoc-in 和 Haskell 的镜头有什么区别?

haskell - 更改 Haskell 的元编程仿函数

haskell - 折叠。 foldr 函数组合 - Haskell

haskell - 为什么组合两个函数不起作用?

haskell - 如何在 Haskell 中使用镜头操作列表

Haskell:检测当前操作系统

haskell:创建记录列表

haskell - 将 Iso 提升到 Bifunctor 的第一个参数

haskell - 无法使用镜头从嵌套 JSON 收集值