我认为要找出正确的Lens
抽象,记住一个具体的可镜头类型会很有帮助。
但是,对于您的特定示例,我们可以说:
case class Lens[O[_],V[_],A,B](get: O[A] => V[A], set: (O[A],V[B]) => O[B])
我不认为这种镜头可以组成。为了组成镜头,a 的结果get
必须能够输入set
. 但是在这里, a 的结果get
是 a V[_]
,而set
需要 a O[_]
。
作为进一步的解释,这是另一种可能的多态镜头,但它可能不适合您的需求:
trait Lens[T[_]] {
def get[A](t: T[A]): A
def set[A,B](t: T[A], x: B): T[B]
}
它可以像这样组成:
def composeLenses[T[_],U[_]](lens1: Lens[T], lens2: Lens[U]) =
new Lens[({type x[A] = T[U[A]]})#x] {
def get[A](t: T[U[A]]): A = lens2.get(lens1.get(t))
def set[A,B](t: T[U[A]], x: B): T[U[B]] = lens1.set(t, lens2.set(lens1.get(t), x))
}
我无法Lens
抽象地找出定义 - 为了做到这一点,我必须使用这个具体案例:
case class Box[A](x: A)
def boxBoxGet[A](b: Box[Box[A]]): A = ???
def boxBoxSet[A,B](b: Box[Box[A]], x: B): Box[Box[B]] = ???