如何将选项元组转换为Scala中的选项元组?

时间:2014-01-30 17:11:44

标签: scala tuples scala-option

这个问题与this question相反。

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

纯Scala答案和Scalaz答案都很有帮助。

5 个答案:

答案 0 :(得分:10)

我实际上认为你的回答非常明确,但是既然你提到了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,但不幸的是标准库从OptionIterable的可怕隐式转换将首先启动,你最终会得到一个{{ 1}}。


回顾一年后:实际上可以用Scalaz的(Iterable[Int], Iterable[Int])做到这一点:

UnzipPairOps

你在想什么,2014年我?

答案 1 :(得分:8)

根据Jim的回答,但有一些语法可能会更容易阅读:

val x = Some(1 -> 2)
val (y, z) = x map {case (a,b) => Some(a) -> Some(b)} getOrElse (None -> None)

答案 2 :(得分:6)

我能想出的最好的是以下内容,但对我来说看起来很傻:

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

答案 3 :(得分:4)

根据Rob Norris对猫咪gitter频道的建议,你可以通过致电<extrusion id="arc" convex="false" crossSection=" -1 -0.5 -0.7 -0.4 -0.4 -0.35 0 -0.3 0.4 -0.35 0.7 -0.4 1 -0.5 1 0.2 0.7 0.3 0.4 0.35 0 0.4 -0.4 0.35 -0.7 0.3 -1 0.2 -1 -0.5 " spine=" 0 -1 0 0 0 0 " scale=" 1 1 1 1 "> </extrusion> 与猫一起做到这一点:

var urlcli = new WebClient();
string sourcecode = urlcli.DownloadString(urltxt.Text.Trim());

.separate作业中的类型注释是相关的;隐含操作@ import cats.implicits._ import cats.implicits._ @ val x: Option[(Int, Int)] = Some((1, 2)) x: Option[(Int, Int)] = Some((1, 2)) @ x.separate res6: (Option[Int], Option[Int]) = (Some(1), Some(2)) 而不是x

Option

Some@ val x = Some((1, 2)) x: Some[(Int, Int)] = Some((1, 2)) @ x.separate cmd2.sc:1: value separate is not a member of Some[(Int, Int)] val res2 = x.separate

提供

答案 4 :(得分:2)

Scala 2.13开始,Option#unzip在标准库中提供了这种确切的行为:

// val x: Option[(Int, String)] = Some(1, "hello")
x.unzip
// (Some(1), Some("hello"))
val (y, z) = x.unzip
// y: Option[Int] = Some(1)
// z: Option[String] = Some("hello")

// val x: Option[(Int, String)] = None
x.unzip
// (None, None)

还要注意三元素元组的等效项:Option#unzip3