Этот вопрос противоположный this question.Как преобразовать кортеж опции в кортеж параметров в Scala?
val x = Some((1, 2))
val (y: Option[Int], z: Option[Int]) = ???
И чистые ответы Scala, и Scalaz anwers полезны.
Этот вопрос противоположный this question.Как преобразовать кортеж опции в кортеж параметров в Scala?
val x = Some((1, 2))
val (y: Option[Int], z: Option[Int]) = ???
И чистые ответы Scala, и Scalaz anwers полезны.
Я на самом деле думаю, что ваш ответ совершенно ясен, но так как вы упоминаете Scalaz, эта операция называется unzip
:
scala> import scalaz._, std.option._
import scalaz._
import std.option._
scala> val x: Option[(Int, Int)] = Some((1, 2))
x: Option[(Int, Int)] = Some((1,2))
scala> Unzip[Option].unzip(x)
res0: (Option[Int], Option[Int]) = (Some(1),Some(2))
вы должны быть в состоянии написать просто x.unzip
, но, к сожалению, ужасно неявное преобразование из стандартной библиотеки от Option
до Iterable
начнется в первом, и вы будете в конечном итоге с (Iterable[Int], Iterable[Int])
.
Оглядываясь назад год спустя: на самом деле это можно сделать с помощью Scalaz-х UnzipPairOps
:
scala> import scalaz.std.option._, scalaz.syntax.unzip._
import scalaz.std.option._
import scalaz.syntax.unzip._
scala> val x: Option[(Int, Int)] = Some((1, 2))
x: Option[(Int, Int)] = Some((1,2))
scala> x.unfzip
res0: (Option[Int], Option[Int]) = (Some(1),Some(2))
Что вы думали, 2014 меня?
Лучшее, что я мог придумать, состоит в следующем, но она выглядит Гуфи мне:
val x = Some((1, 2))
val (y, z) = x map {x => (Some(x._1), Some(x._2)) } getOrElse (None, None)
Я не думаю, что это вообще глупо, оно описывает, что вы пытаетесь сделать, я могу просто заменить «x map {x => ...' на 'x map {case (fst, snd) => ... ', чтобы избежать вызова' _1' и '_2'. – vptheron
Согласно ответу Джима, но с синтаксисом, что некоторые из них могут найти легче читать:
val x = Some(1 -> 2)
val (y, z) = x map {case (a,b) => Some(a) -> Some(b)} getOrElse (None -> None)
Интересно, если Shapeless (https://github.com/milessabin/shapeless) дает краткий ответ на этот ? –
Вы можете получить итератор с tuple.productIterator. Существует также productArity и productElement (n: Int) –