Haskell 如何使用镜头设置功能?
我有一个元组Haskell 如何使用镜头设置功能?,haskell,haskell-lens,maybe,lenses,Haskell,Haskell Lens,Maybe,Lenses,我有一个元组x和一个可能值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没有这样的操作符,也许我不需要它 那么,如何使用镜头设置功能和可能?这似乎是您想要的 maybeSetFst :: (a, b) -> Maybe a
x
和一个可能值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
没有这样的操作符,也许我不需要它
那么,如何使用镜头设置功能和可能?这似乎是您想要的
maybeSetFst :: (a, b) -> Maybe a -> (a, b)
如果给定了更新值,它将更新第一个字段,否则将不处理它。我认为您提供的第一个实现非常好,但您可以提供更通用的类型:
maybeSetFst :: Field1 s s a a => s -> Maybe a -> s
如果您不希望这种通用性,可以跳过镜头并编写(使用TupleSections
)
另一个选项是应用可能
以获得更新功能:
maybeSetFst p m = maybe id (_1 .~) m p
哪些是可以写的
maybeSetFst = flip $ maybe id (_1 .~)
无点愚蠢。不确定你想在这里做什么-你想要一个函数(a,b)->也许a->(a,a)
或者一个函数(a,b)->也许a->(a,b)
?(a,b)->也许a->(a,a)
,但是(a,b)->也许a->也许a->(a,b)
你的意思是(\v->x&/u 1.~v)
相反,您能举一个输入和输出的完整示例吗;另外,我建议大家看看棱镜也许它正是你要找的东西。这里已经有了完整的例子。我有一个元组(1,2)
,我有一个输入可能是Int
。使用lens
使用此输入更新此元组的正确方法是什么?
maybeSetFst = flip $ maybe id (_1 .~)