如果你想與地圖鏡頭組成鏡頭部分的鏡頭,你可以用compose
:
import scalaz._, Scalaz._, PLens._
def headFoo[A] = listHeadPLens[A] compose mapVPLens("foo")
然後:
scala> headFoo.get(Map("foo" -> List(42)))
res0: Option[Int] = Some(42)
scala> headFoo.get(Map("foo" -> Nil))
res1: Option[Nothing] = None
scala> headFoo.get(Map("bar" -> List(13)))
res2: Option[Int] = None
注意,這是Scalaz 7.
如果你想組成的鏡頭不是部分的,你可以使用~
:
scala> def firstFoo[A, B] = ~Lens.firstLens[A, B] compose mapVPLens("foo")
firstFoo: [A, B]=> scalaz.PLensFamily[Map[String,(A, B)],Map[String,(A, B)],A,A]
scala> firstFoo.get(Map("foo" -> (42, 'a)))
res6: Option[Int] = Some(42)
還有一個.partial
方法,如果你不喜歡單目運算符。
謝謝,這是一個偉大的答案。我終於得到鏡頭組成與我的應用程序一起工作 - 大量的編譯時爭吵,沒有運行時間的爭吵! –
總之,訣竅是在處理地圖時,將「.partial」添加到值鏡頭。 –