将 Lens 组合成一个元组的 Lens

Combine Lens into a Lens of a tuple

给出

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

上面有nicer/canonical定义sndPerson的方法吗?

alongside 将一对镜片变成一对镜片。

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

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