【发布时间】:2015-03-18 23:42:20
【问题描述】:
Python 在列表中的enumerate 可以写成zip [0..]。我查看了 Control.Lens.Traversal 和 Control.Lens.Indexed,但我不知道如何使用镜头将其推广到任何合理的容器(我不敢说“Traversable”)。
我猜itraverse 或itraverseOf 是关键。
【问题讨论】:
-
我相信
lens提供了索引地图,但我不确定。我知道如果你使用Data.Sequence,那么使用mapWithIndex (,)比任何形式的遍历都要高效。 -
itraverse当然可以满足您的需求。您使用它有什么困难? -
@Carl 我对
itraverse (,) "abcd"的天真直觉抱怨缺乏 Int 的幺半群实例。看起来使用(,)作为第一个参数给了我错误的输出类型,即(Int, t a)而不是t (Int, a)。 -
@AlexR 嗯,是的。
traverse和itraverse在Applicative上下文中工作,您将忽略它。试试imap f = runIdentity . itraverse (\i a -> return (f i a))。 -
不知道镜头,但这与"How to decorate a Tree in Haskell" 中讨论的问题基本相同。 The answer by hammar 与 bhelkir's response to your question 相同。
标签: haskell haskell-lens