如何一个接一个地遍历数据结构的不同部分?

phi*_*chu 5 haskell traversal haskell-lens

Control.Lens.Traversalbeside函数遍历的两个部分Bitraversable.给出的例子是

>>> ("hello",["world","!!!"])^..beside id traverse
["hello","world","!!!"]
Run Code Online (Sandbox Code Playgroud)

我可以编写一个更明确的版本beside(让我们称之为bothParts)而不是Bitraversable约束需要两个Traversals吗?我想它可以像这样使用:

>>> ("hello",["world","!!!"])^..bothParts _1 _2 id traverse
["hello","world","!!!"]
Run Code Online (Sandbox Code Playgroud)

这已经存在了吗?这样做是否太安全了?谢谢!

编辑:

或许类似于:

>>> ("hello",["world","!!!"])^..bothParts _1 (_2.traverse)
["hello","world","!!!"]
Run Code Online (Sandbox Code Playgroud)

fiz*_*ruk 2

你想要的组合器应该Traversal同时使用 2 秒。但这种组合器Traversal通常违反了法则,特别是“禁止重复”法则:aTraversal只能遍历每个元素一次。

\n\n

这是您可能不想要的示例:

\n\n
>>> (1, 2) ^.. bothParts _1 _1\n[1, 1]    \n
Run Code Online (Sandbox Code Playgroud)\n\n

更准确地说,我想引用Traversal中的文档lens

\n\n
\n

for 的定律遵循“迭代器模式的本质”中所述的Traversal tfor 的定律。Traversable

\n
\n\n
t pure \xe2\x89\xa1 pure\nfmap (t f) . t g \xe2\x89\xa1 getCompose . t (Compose . fmap f . g)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

这一要求的一个结果是,aTraversal需要留下与Traversal它开始时的后续候选元素相同数量的元素。这些定律的力量的另一个证明是,“迭代器模式的本质”第 5.5 节中表达的关于Traversable多次遍历同一条目的奇异实例的警告实际上已经被同一篇论文中的第二定律排除了!

\n
\n