将镜头组合成元组的一个镜头。

3

鉴于

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吗?


2
_2 . name 怎么样? - epsilonhalbe
这提供了类型 forall s t b (f :: * -> *). (Field2 s t b b, HasPerson b, Functor f) => (String -> f String) -> s -> f t,它不是 Lens' (a, Person) (a, String) - Louis Pan
1
那是类型Lens' (a, Person) String,而不是Lens' (a, Person) (a, String) - Louis Pan
1个回答

6
alongside将一对镜头变成一个适用于一对的镜头。
因为在这个例子中你并没有聚焦到第一个组件,所以你可以简单地将id作为第一个镜头传递。
sndPerson :: Lens' (a, Person) (a, String)
sndPerson = alongside id name

谢谢,这正是我在寻找的。 - Louis Pan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接