2014-01-30 2 views
9

Этот вопрос противоположный this question.Как преобразовать кортеж опции в кортеж параметров в Scala?

val x = Some((1, 2)) 
val (y: Option[Int], z: Option[Int]) = ??? 

И чистые ответы Scala, и Scalaz anwers полезны.

+0

Интересно, если Shapeless (https://github.com/milessabin/shapeless) дает краткий ответ на этот ? –

+0

Вы можете получить итератор с tuple.productIterator. Существует также productArity и productElement (n: Int) –

ответ

9

Я на самом деле думаю, что ваш ответ совершенно ясен, но так как вы упоминаете 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 меня?

6

Лучшее, что я мог придумать, состоит в следующем, но она выглядит Гуфи мне:

val x = Some((1, 2)) 
val (y, z) = x map {x => (Some(x._1), Some(x._2)) } getOrElse (None, None) 
+4

Я не думаю, что это вообще глупо, оно описывает, что вы пытаетесь сделать, я могу просто заменить «x map {x => ...' на 'x map {case (fst, snd) => ... ', чтобы избежать вызова' _1' и '_2'. – vptheron

7

Согласно ответу Джима, но с синтаксисом, что некоторые из них могут найти легче читать:

val x = Some(1 -> 2) 
val (y, z) = x map {case (a,b) => Some(a) -> Some(b)} getOrElse (None -> None) 
Смежные вопросы