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

时间:2016-10-12 00:01:19

标签: haskell lens

我需要像<<%~这样的函数,它与Traversal的行为方式与^?类似,如下所示:

(<<?%~) :: 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])

我该如何实施?显而易见的方法是分别应用^?%~,但我想一次性解决问题。

1 个答案:

答案 0 :(得分: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))