Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何使用镜头设置功能?_Haskell_Haskell Lens_Maybe_Lenses - Fatal编程技术网

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