我有一个元组x
和一个Maybe
值y
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
函数?
答案 0 :(得分:1)
似乎你想要
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 .~)
无瑕疵。