这个问题与this question相反。
val x = Some((1, 2))
val (y: Option[Int], z: Option[Int]) = ???
纯Scala答案和Scalaz答案都很有帮助。
答案 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
,但不幸的是标准库从Option
到Iterable
的可怕隐式转换将首先启动,你最终会得到一个{{ 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
。