この質問は、この質問の反対です。
val x = Some((1, 2))
val (y: Option[Int], z: Option[Int]) = ???
純粋な Scala の回答と Scalaz の回答の両方が役に立ちます。
この質問は、この質問の反対です。
val x = Some((1, 2))
val (y: Option[Int], z: Option[Int]) = ???
純粋な Scala の回答と Scalaz の回答の両方が役に立ちます。
実際、あなたの答えは完全に明確だと思いますが、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年の私は何を考えていましたか?
ジムの回答によると、一部の人が読みやすい構文を使用しています。
val x = Some(1 -> 2)
val (y, z) = x map {case (a,b) => Some(a) -> Some(b)} getOrElse (None -> None)
私が思いつくことができる最高のものは次のとおりですが、私には間抜けに見えます:
val x = Some((1, 2))
val (y, z) = x map {x => (Some(x._1), Some(x._2)) } getOrElse (None, None)