Maybe如何使用镜头设置功能?

How to use lens set function with Maybe?

我有一个元组 x 和一个 Maybey

x = (1,1)
y = Just 2

我能做到

z = maybe x (\v -> x & _1 .~ v) y

或者我可以创建自己的运算符

(.~?) x y =  x %~ (\v -> fromMaybe v y)

z = x & _1 .~? y

但是如果lens没有这样的运算符,也许我不需要它?

那么,lens set 函数如何与 Maybe 一起使用?

看来你想要

maybeSetFst :: (a, b) -> Maybe a -> (a, b)

如果给定更新值,它将更新第一个字段,否则将保持不变。我觉得你给的第一个实现很好,但是你可以给它一个更通用的类型:

maybeSetFst :: Field1 s s a a => s -> Maybe a -> s

如果你不想要那种笼统,你可以跳过镜头写(使用TupleSections

maybeSetFst p@(_,b) = maybe p (,b)

另一种选择是应用maybe来获取更新函数:

maybeSetFst p m = maybe id (_1 .~) m p

可以这样写

maybeSetFst = flip $ maybe id (_1 .~)

无意义的愚蠢。