На самом деле, это не вполне перевод, который происходит. Вы можете обратиться к этому ответу для более полного руководства, но этот случай явно не упоминается даже там.
Что происходит, так это то, что для понимания с сопоставлением с шаблоном фильтруется несоответствующий регистр. Например,
for((i, j) <- List((1, 2), 3)) yield (i, j)
вернет List((1, 2)): List[(Any, Any)]
, так как withFilter
вызывается первым. Теперь Either
, похоже, не имеет withFilter
, поэтому он будет использовать filter
, и вот фактический перевод этого для понимания:
e.right.filter { case (i, j) => true; case _ => false }.map { case (i, j) => i + j }
Что дает точно такую же ошибку. Проблема в том, что e.right
возвращает RightProjection
, но filter
при RightProjection[A, B]
возвращает Option[Either[Nothing, B]]
.
Причина этого в том, что не существует такого понятия, как «пустой» Either
(или RightProjection
), поэтому ему необходимо инкапсулировать свой результат в Option
.
Сказав все это, действительно удивительно, если взглянуть на уровень понимания. Я думаю, правильнее было бы, если бы filter
вернул вместо этого какой-то отфильтрованный прогноз.