5

在函数中遍历 aControl.Lens.Traversalbeside两个部分Bitraversable。给出的例子是

>>> ("hello",["world","!!!"])^..beside id traverse
["hello","world","!!!"]

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

>>> ("hello",["world","!!!"])^..bothParts _1 _2 id traverse
["hello","world","!!!"]

这已经存在了吗?这是否太不安全而无法正常使用?谢谢!

编辑:

或者可能是这样的:

>>> ("hello",["world","!!!"])^..bothParts _1 (_2.traverse)
["hello","world","!!!"]
4

1 回答 1

2

您想要的组合器应该Traversal同时使用 2 秒。但是这种组合Traversal器通常会违反规律,特别是“不重复”规律: aTraversal应该只遍历每个元素一次。

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

>>> (1, 2) ^.. bothParts _1 _1
[1, 1]    

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

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

t pure ≡ pure
fmap (t f) . t g ≡ getCompose . t (Compose . fmap f . g)

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

于 2014-05-23T19:49:27.840 回答