最初の行にタイプ注釈を追加する必要があるのはなぜですか? c.get[List[String]]("primary-group")
は、それがトップタイプを維持し、Decoder.Result[String]
あるべきflatMap
後Decoder.Result[List[String]]
ですが、それはどちらか[DecodingFailure、文字列]に変更されます。どうして?問題はそれがdependent type
ですか? : Decoder.Result[String
なしflatMapを使用したタイプの解像度
case class JWTPayload(primaryGroup: Group, groupMember: List[Group], name: String, pid: String)
implicit val jwtPayloadDecoder: Decoder[JWTPayload] = Decoder.instance(c =>
(
c.get[List[String]]("primary-group").flatMap(l => if(l.size == 1) l.head.asRight else DecodingFailure("", c.history).asLeft) : Decoder.Result[String],
c.get[List[String]]("group-member"),
c.get[String]("name"),
c.get[String]("pid")
).map4(
JWTPayload
)
)
私はこれがフル答えではないが、私はそれはいくつかの洞察を提供することを願っています
Error:(43, 7) value map4 is not a member of (scala.util.Either[io.circe.DecodingFailure,String], io.circe.Decoder.Result[List[String]], io.circe.Decoder.Result[String], io.circe.Decoder.Result[String])
possible cause: maybe a semicolon is missing before `value map4'?
).map4(
おかげ
私はヴァル 私は タイプの結果を持っている場合は、[A] =いずれかの[DecodingFailure、A]ということである奇妙な行動:私は書いていない[文字列] =右( "123")結果 //入力はいずれかである[DecodingFailure、INT] ヴァルdefaultTypeInference = a.map(Integer.parseInt) // [INT] ヴァルcoercedToBeResult結果であると強制:結果[INT] = a.map(Integer.parseInt) を この場合のflatMapのマップがResult型を保持しないのはなぜですか?私はこれがタイプエイリアスではないことを知っていますが、とにかく – user1698641
@ user1698641、私はあなたの意見を得るのか分かりません。私が 'c.get [String](" name ")のように' map'を使用するものに3行目を変更した場合。map(x => x + x) 'の場合、明示的な型ヒント' Decoder.Result [String] 'を指定しないかぎり、コンパイルも停止します。このシナリオの問題は、 'flatMap'を実行したときに型が失われるということではありません。 'Result [A]'と 'DecodingFailure、A 'の型はまったく同じで、Scalaコンパイラはそれを知っています。問題は、 'Decoder.Result [_]'に '_ [_、_]'型のこの自明でない** _ split _ **が失われ、Scalaコンパイラがそれ自身で再作成するのに十分スマートではないということです。 – SergGr