Выбор.zip возвращает список, а не вариант

стандартная библиотечная документация описывает zip частичная подпись как def zip[B](that: GenIterable[B]): Option[(A, B)] но Some(1) zip Some(2) возвращает List((1,2)) не Some((1,2)). Это случай реализации багги или багги документации?

1 ответов


багги документации.

zip на самом деле, определенных на Iterable, и это применимо к Option из-за неявного преобразования option2Iterable (это явно указано в документации, если присмотреться).

по этой причине Option сначала преобразуется в Iterable а то zip операция поддерживается.

это делается для повторного использования кода, но он пропускает некоторый случай, в котором Iterable методы имеют смысл непосредственно на Option без необходимость неявного преобразования.

вот соответствующее обсуждение в списке рассылки:https://groups.google.com/forum#!тема / scala-язык/MFU5PPt_jYw

Если вам действительно нужно zip два варианта, вы можете использовать этот метод:

(opt1 zip opt2).headOption

кроме того, как Трэвис отметил в комментариях, вы можете альтернативно использовать scalaz Zip введите класс, хотя вам придется использовать fzip вместо.

opt1 fzip opt2