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

时间:2016-02-01 15:55:38

标签: haskell lens maybe lenses

我有一个元组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函数?

1 个答案:

答案 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 .~)

无瑕疵。