我需要像 <<%~
这样的函数它将与 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])
我应该如何实现它?最明显的方法是申请 ^?
和%~
分开,但我想要一次性解决。
最佳答案
如果我们不想在目标上要求 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))
关于haskell - `<<%~` 的类似物不需要 Monoid 进行遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39988557/