`<<%~` 的模拟不需要 Monoid 来遍历
Analog of `<<%~` not requiring Monoid for Traversal
我需要一个类似<<%~
which would act with Traversal
s in similar fashion to ^?
的函数,像这样:
(<<?%~) :: 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])
我该如何实施?显而易见的方法是分别应用 ^?
和 %~
,但我想要一个解决方案。
如果我们不想在目标上要求 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))
我需要一个类似<<%~
which would act with Traversal
s in similar fashion to ^?
的函数,像这样:
(<<?%~) :: 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])
我该如何实施?显而易见的方法是分别应用 ^?
和 %~
,但我想要一个解决方案。
如果我们不想在目标上要求 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))