将 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
给出
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