Maybe如何使用镜头设置功能?
How to use lens set function with Maybe?
我有一个元组 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
一起使用?
看来你想要
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 .~)
无意义的愚蠢。
我有一个元组 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
一起使用?
看来你想要
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 .~)
无意义的愚蠢。