「の」の型「製品」を選択しますん:なぜScalaは、私はオプションと値の定義を理解するために作成した場合、予想通り、それが動作のいずれかを含む式と値の定義
scala> for (a <- Some(4); b <- Some(5); val p = a * b) yield p
res0: Option[Int] = Some(20)
が同じことを行いますどちらかとの事は私は価値の定義を持っていない場合は動作します:
scala> for (a <- Right(4).right; b <- Right(5).right) yield a * b
res1: Either[Nothing,Int] = Right(20)
しかし、私は価値の定義を使用した場合、Scalaはのための理解のために間違ったコンテナ型を推論するようだ:
scala> for (a <- Right(4).right; b <- Right(5).right; val p = a * b) yield p
<console>:8: error: value map is not a member of Product with Serializable with Either[Nothing,(Int, Int)]
for (a <- Right(4).right; b <- Right(5).right; val p = a * b) yield p
^
どうしてですか?この振る舞いを回避するにはどんな方法がありますか?
ああ、それは理にかなっています。あなたは私がすぐにきれいにするだろう最初(私は素数、微妙なタイプのエラーなど)で私をトリップしたいくつかのタイプミスがあります。 – srparish
上記の興味深い結果は、私が一貫性のあるモナドの型を持っていれば、うまくいくということです。だから私は正しい投射だけを気にすると、暗黙のdef RightProjection [A、B](v:[A、B]のどちらか):Either.RightProjection [A、B] = v.right – srparish
もう一度、徹底的な執筆に感謝します!私は参照を読んで、何が起こっていたのかをまだ分かっていなかった。明らかにこの単純な例では、a * bを歩留まりに移動できますが、それが別のEitherを返す関数に渡す必要がある複雑な計算に置き換えられた場合(これを数回繰り返します)、中間を使用できる値の割り当ては、複数のレベルの連鎖/収束ステートメントを持つ必要がなくなり、よりクリーンになります。 – srparish