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 使用镜头“;塞特;仅当输入值为“时”;只有x;?_Haskell_Haskell Lens_Lenses - Fatal编程技术网

Haskell 使用镜头“;塞特;仅当输入值为“时”;只有x;?

Haskell 使用镜头“;塞特;仅当输入值为“时”;只有x;?,haskell,haskell-lens,lenses,Haskell,Haskell Lens,Lenses,当输入值(未设置的字段)是一个仅为x时,是否有任何方法应用在中提到的组合符/设置器 例如,考虑(~+)组合符,如果我有以下内容: let target = (1, 2) input1 = Just 10 input2 = Nothing (11, 2) == target & (_1 . someSetter) +~ input1 & (_2 . someSetter) +~ input2 我想要一个执行以下操作的sett

输入值(未设置的字段)是一个
仅为x时,是否有任何方法应用在中提到的组合符/设置器

例如,考虑
(~+)
组合符,如果我有以下内容:

let target = (1, 2)
    input1 = Just 10
    input2 = Nothing
(11, 2) == target & (_1 . someSetter) +~ input1 
                  & (_2 . someSetter) +~ input2
我想要一个执行以下操作的setter:

let target = (1, 2)
    input1 = Just 10
    input2 = Nothing
(11, 2) == target & (_1 . someSetter) +~ input1 
                  & (_2 . someSetter) +~ input2

在这种情况下,我试图避免使用
fmap
maybe/fromMaybe
,因为我有很多这样的操作要做,我更喜欢通过利用镜头的简洁性来避免样板文件。

您可以定义自己的setter

maybester::(b->a->a)->asettera->maybeb->s->t
maybester g f x=runIdentity。f(身份,可能id为Gx)
(+!)::numa=>asettera->maybea->s->t
(+!)=maybester(+)
让目标=(1,2)
输入1=仅为10
输入2=无
在里面
(11,2)=目标&(1.someSetter)+!输入1
&(2.someSetter)+!输入2
您还可以轻松定义其他设置器

(-!::Num a=>ASetter s t a->Maybe a->s->t
(!)=可贝斯特减法
(| |!)::更好的s t Bool Bool->也许Bool->s->t
(| |!)=maybester(| |)
(!)::半群a=>ASetter s t a->可能a->s->t
(!)=maybester(flip())
(.!)::更好的s t a->可能是a->s->t
(.!)=maybester const
(!)::更好的s t a->Maybe(a->a)->s->t
(!)=Maybester id

这就是镜头的酷之处。它们只是常规函数。

Hmm,这是否迫使我为控制中的每个setter.Lens定义一个新的setter。我要使用的镜头,例如
+~
-~
| ~
~
%~
,等等?我会很惊讶Control.Lens,作为终极瑞士军刀,它没有这种现成的东西。是的,你会的。然而,情况并不像看上去那么糟。您可以创建一个通用setter组合器并对其进行专门化。例如,
maybester::(a->a->a)->ASetter s t a->maybester a->s->t;maybester g f x=runIdentity。f(标识。可能id为gx)
。然后,您可以创建特定的函数,如
(+!)=maybester(+)
(!)=maybester subtract
(|!)=maybester(| |)
(!)=maybester(flip())
(!)=maybester
,以及
(!)=maybester id
。请注意,此代码未经测试,因为我正在手机上键入它。