haskell - `<<%~` 的类似物不需要 Monoid 进行遍历

标签 haskell 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])

我应该如何实现它?最明显的方法是申请 ^?%~分开,但我想要一次性解决。

最佳答案

如果我们不想在目标上要求 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/

相关文章:

haskell - 使用 Maybe 和 Writer 过滤列表并跟踪过滤器命中

haskell - 吃我的麦片并解析它

Haskell - 镜头,使用 'to' 函数

haskell - 如何使用镜头库通过索引从列表中删除项目?

haskell - 如何使用镜头列表?

haskell - Setter 保留索引是什么意思?

http - 使用 http-conduit 在 Haskell 中发送 HTTP/POST 的基本方法

list - 元组列表的交集 - Haskell

haskell - Control.Lens 中的 Market 这个名称背后的原因是什么?

Haskell 函数::[名称] -> [[(名称, Bool)]]