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
。请注意,此代码未经测试,因为我正在手机上键入它。