7

ここに Scalaz マップ レンズの例があります: Dan Burton はそれcontainsKeyを と呼んでおり、Edward Kmett の講演に触発されています。Scalaz 7 で呼び出さmapVPLensれ、マップの値を変更するのに役立つものもあります。

私の質問は、 type を変更するためVのレンズと a のためのレンズがある場合Map[K,V]、どうすればそれらを構成できますか? 私は良い単純な例をしばらく探していましたが、Scalaz にはまだ例が不足しています。

Scalaz 6 と Scalaz 7 の両方のソリューションに興味があります。

4

1 に答える 1

9

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

于 2013-09-16T19:32:58.030 に答える