你做任何一個:
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
會創建一個LeftProjection
或RightProjection
對象,該對象是包含Either[A, B]
對象的包裝器。
對於left
包裝,隨後map
與函數f: A => C
應用於變換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
。如果這種假設是錯誤的,映射不做任何事情,但類型參數會相應地改變。
從下面的評論看來,你似乎混淆了''或'與'Pair','Tuple2'。情況並非如此:「任一」只能包含_one_值。從某種意義上說,它與C中的'union'類似,除了你知道哪個成員實際存儲了。 –
我意識到了這一點,但我仍然感到困惑,一個預測被投入混合。我沒有清楚地表達這一點。 –