gpt4 book ai didi

haskell - 组成设置镜头的语法是什么?

转载 作者:行者123 更新时间:2023-12-02 16:49:20 25 4
gpt4 key购买 nike

我是lens新手,我想编写两个“setter”操作来相当于state0到new_state2的转换:

  let new_state1 = field1 %~ (const newVal1) $ state0
let new_state2 = field2 %~ (const newVal2) $ new_state1

执行此操作的语法是什么?

最佳答案

有趣的是,镜头的组成就像函数一样:带有 (.):

setterAB :: Lens' A B
setterBC :: Lens' B C

setterAC = setterAB . setterBC

但是,在您的示例中,您不想组合镜头;您想要组合变换(既是镜头又是实际操作),有两种方法可以做到这一点。

哦,在我们真正开始之前,让我们稍微简化一下代码,使用 (.~) ("set") 而不是 (%~) (“修改”):

let new_state1 = field1 .~ newVal1 $ state0
let new_state2 = field2 .~ newVal2 $ new_state1

直接、通过&

有一个奇特的 & 运算符,效果非常好。这只是翻转($):

let new_state1 = state0 & field1 .~ newVal1
let new_state2 = new_state & field2 .~ newVal2

这意味着您现在可以编写:

let new_state = 
state0
& field1 .~ newVal1
& field2 .~ newVal2

单子(monad)

更好的是,如果你实际上在某个地方有一个 State ,你可以完全摆脱该传递并将其放入一个 monad 中:

let new_state = (flip execState state0) $ do
field1 .= newVal1
field2 .= newVal2

它们是根据 MonadState 定义的,因此如果您位于 monad 堆栈中,您可以直接使用该实例,或者使用 StateT 以获得更多 setter 可用的效果。

关于haskell - 组成设置镜头的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37355769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com