模拟"<<%〜"不需要Monoid进行遍历

mod*_*lar 5 haskell haskell-lens

我需要这样的函数<<%~,其将与行事Traversal以类似的方式s到^?,像这样:

(<<?%~) :: Traversal s t a b -> (a -> b) -> s -> (Maybe a, t)

> ix 0 <<?%~ succ $ [1,2]
(Just 1,[2,2])
> ix 1 <<?%~ succ $ [1,2]
(Just 2,[1,3])
> ix 2 <<?%~ succ $ [1,2]
(Nothing,[1,2])
Run Code Online (Sandbox Code Playgroud)

我该如何实施呢?最显而易见的方法是应用^?%~分开,但我想一气呵成的解决方案.

mod*_*lar 4

如果我们不想要求Monoid对目标进行约束,我们必须自己指定Monoid将用于在遍历中组合旧元素的目标。由于目标类似于^?,因此适当的幺半群是First

(<<?%~) :: LensLike ((,) (First a)) s t a b -> (a -> b) -> s -> (Maybe a, t)
l <<?%~ f = first getFirst . (l $ \a -> (First (Just a), f a))
Run Code Online (Sandbox Code Playgroud)

  • 我相当彻底地改变了你的解决方案的框架。如果您不喜欢更改,请随时恢复更改。 (3认同)