マップ レンズで合成しようとしているレンズが部分レンズの場合は、次のように使用できます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
単項演算子が気に入らない場合の方法もあります。