14

この質問は、この質問の反対です。

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

純粋な Scala の回答と Scalaz の回答の両方が役に立ちます。

4

5 に答える 5

11

実際、あなたの答えは完全に明確だと思いますが、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])


1 年後を振り返ってみると、実際には 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年の私は何を考えていましたか?

于 2014-01-30T17:29:49.247 に答える
8

ジムの回答によると、一部の人が読みやすい構文を使用しています。

val x = Some(1 -> 2)
val (y, z) = x map {case (a,b) => Some(a) -> Some(b)} getOrElse (None -> None)
于 2014-01-30T18:09:34.950 に答える
7

私が思いつくことができる最高のものは次のとおりですが、私には間抜けに見えます:

val x = Some((1, 2))
val (y, z) = x map {x => (Some(x._1), Some(x._2)) } getOrElse (None, None)
于 2014-01-30T17:11:44.140 に答える