有没有一个镜头操作符来结合 %~ 和 fmap?

3

我有以下代码

u & currentDay %~ fmap (addDays 1)

currentDay返回一个Maybe,这就是为什么我需要使用fmap的原因。 是否已经存在一种将%~fmap结合起来的运算符(例如%~<$> ;-))或者巧妙的方法可以实现?


u & currentDay %~ (addDays 1 <$>) 怎么样? - Aadit M Shah
确实如此,但我更有兴趣了解镜头库是否已经有运算符来完成这个操作。有很多函数,其中一些很难理解。 - mb14
3
你可以使用mappedu & currentDay . mapped %~ addDays 1。这行代码的意思是将 ucurrentDay 下的所有元素都加上一天。 - cchalmers
@cchalmers 有趣。但是没有将“mapped”和“%〜”组合的(已经存在的)运算符? - mb14
@mb14 不在镜头中(设置组合器在这里)。但是编写自己的组合器并不太难。 - cchalmers
@cchalmers 好的。我不喜欢重复造轮子,所以我只是在检查它是否已经存在。实际上,“mapped”可能就是我要找的东西。你能把它写成答案,这样我就可以接受它了吗? - mb14
1个回答

3

目前没有现成的运算符来完成这个操作,但是你可以很容易地定义一个自己的运算符:

%$~ :: Functor f => ASetter s t (f a) (f b) -> (a -> b) -> s -> t
l %$~ f = over a (fmap f)

标准的做法是使用mapped设置器:

u & currentDay . mapped %~ addDays 1

因为你正在映射 Maybe,所以你也可以使用 _Just 棱镜:

u & currentDay . _Just %~ addDays 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接