1

モノクル プロジェクトのJsonExampleを使用して、set 呼び出しがキーと値のペアの値を置き換えるか、キーと値のペアがまだ存在しない場合は作成するレンズを作成したいと思います。

ただし、これはインデックス(タイプセーフを構成できる)またはタイプセーフではないatのいずれかで表されているようです

//for replacing:
(jsObject composeOptional index("age") composePrism jsNumber).set(45)

//for creating:
(jsObject composeLens at("age")).set(JsNumber(45)) <- will accept any old json

私ができることは何ですか?
age が別の JsObject にネストされている場合、次のように拡張することもできます。

val n = (jsObject composeOptional index("nested") composePrism 
jsObject composeOptional index("age") composePrism jsNumber).set(45)

「ネストされた」のキーと値のペアがまだ存在しない場合、ネストされたオブジェクトを作成してからフィールドを追加します

n(JsObject(Map.empty)) -> JsObject(Map("nested" -> JsObject("age" -> JsNumber(45)))
4

2 に答える 2

3

現在、ライブラリには非常に特殊な動作があります。

あなたOptionalがいくつIsoPrismで作曲したり、右側の議論を格下げしたりするときPOptional、それは問題です。

Iso[A,B]Prism[A,B]は異なりLens[A,B]Optional[A,B]意味が異なり、全体reverseGetの要素を作成できますが、元の値が必要ですABsetA

したがって、 forOptionalLens場合、値の一部を変更できないことは完全に正当ですが、この値を元のMapまたはに持たない場合JsObject、 forIsoおよびPrism別の動作を定義できます。

問題が議論されるのを待っている間、次の回避策を使用できます

implicit class POptStrictComposition[S, T, A, B](self: POptional[S, T, A, B]) {
  def sComposePrism[C, D](other: PPrism[A, B, C, D]) = new POptional[S, T, C, D] {
    def getOrModify(s: S): T \/ C =
      self.getOrModify(s).flatMap(a => other.getOrModify(a).bimap(self.set(_)(s), identity))

    def set(d: D): S => T =
      self.set(other.reverseGet(d))

    def getOption(s: S): Option[C] =
      self.getOption(s) flatMap other.getOption

    def modifyF[F[_] : Applicative](f: C => F[D])(s: S): F[T] =
      self.modifyF(other.modifyF(f))(s)

    def modify(f: C => D): S => T =
      self.modify(other.modify(f))
  }

  def ^!<-?[C, D](o: PPrism[A, B, C, D]) = sComposePrism(o)

  def sComposeIso[C, D](other: PIso[A, B, C, D]) = sComposePrism(other.asPrism)

  def ^!<->[C, D](o: PIso[A, B, C, D]) = sComposeIso(o)
}

これで、コードを次のように変更してみることができます

(jsObject composeOptional index("age") sComposePrism jsNumber).set(45)

役に立ったかどうかを報告する

于 2015-11-26T12:49:08.943 に答える