次のいずれか
either.left.map(f)
か:
either.right.map(f)
またため、理解使用することができます。for (x <- either.left) yield f(x)
はここにmap
を行うためのより具体的な例ですEither[Boolean, Int]
:
scala> val either: Either[Boolean, Int] = Right(5)
either: Either[Boolean, Int] = Right(5)
scala> val e2 = either.right.map(_ > 0)
either: Either[Boolean, Boolean] = Right(true)
scala> e2.left.map(!_)
either: Either[Boolean, Boolean] = Right(true)
編集:
どのように動作しますか? Either[A, B]
があるとします。 left
またはright
を呼び出すと、Either[A, B]
オブジェクトを保持するラッパーであるLeftProjection
またはRightProjection
オブジェクトが作成されます。 left
ラッパーの
、機能f: A => C
との後続map
Either[A, B]
はEither[C, B]
に変換するために適用されます。これは、フードの下でパターンマッチングを使用して、Either
が実際にLeft
であるかどうかをチェックすることによって行います。存在する場合は、新しいLeft[C, B]
を作成します。そうでない場合は、変更するだけで、同じ基本値を持つ新しいRight[C, B]
が作成されます。
right
ラッパーの場合は逆になります。効果的には、either.right.map(f)
と言っているのは、いずれかの(Either[A, B]
)オブジェクトがRight
の値を保持している場合は、マップします。それ以外の場合は、そのままにしておきますが、いずれかのオブジェクトのタイプB
をマップしたかのように変更します。
技術的には、これらの突起は単なるラッパーです。意味的には、Either
オブジェクトに格納されている値がLeft
またはRight
のいずれかであることを前提としていることを示す方法です。この仮定が間違っていると、マッピングは何もしませんが、型パラメータはそれに応じて変更されます。
以下のコメントから、「ペア」、「タプル2」と混同しているようです。それはそうではありません:「どちらか」には_one_値しか含めることができません。ある意味では、Cの 'union'と似ていますが、実際にどのメンバーが格納されているかは分かりません。 –
私はそれを認識していますが、私はまだ混乱してしまいます。私はそのことをはっきりと表現していませんでした。 –