我認爲要找出正確的Lens
抽象,考慮具體的鏡頭類型會有所幫助。
然而,你的具體的例子,有一些東西我們可以說:
case class Lens[O[_],V[_],A,B](get: O[A] => V[A], set: (O[A],V[B]) => O[B])
我不認爲這種鏡頭可以組成。爲了組成鏡片,get
的結果必須能夠輸入set
。但是在這裏,get
的結果是V[_]
,而set
需要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]] = ???