给定的

data Person = Person { _name :: String }
makeClassy ''Person

这创造了一个
name :: Lens' Person String

我可以定义以下在元组中使用 name 的镜头。
sndPerson :: Lens' (a, Person) (a, String)
sndPerson = lens
    (\(a, p) -> (a, p ^. name))
    (\(_, p) (a, n) -> (a, p & name .~ n))

有没有更好/更规范的方法来定义上面的 sndPerson

最佳答案

alongside 将一对镜头变成一个可以在一对镜头上工作的镜头。

因为在示例中您没有关注第一个组件,您可以简单地将 id 作为第一个镜头传递。

sndPerson :: Lens' (a, Person) (a, String)
sndPerson = alongside id name

关于haskell - 将 Lens 组合成一个元组的 Lens,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47725555/

10-13 08:34