Вы можете либо:
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)
означает - если объект any (Either[A, B]
) содержит значение Right
, отобразите его.В противном случае, оставьте все как есть, но измените тип B
любого объекта, как если бы вы его отобразили.
Так что технически эти проекции - просто обертки.Семантически это способ сказать, что вы делаете что-то, что предполагает, что значение, хранимое в объекте Either
, равно Left
или Right
.Если это предположение неверно, отображение ничего не делает, но параметры типа соответственно изменяются.