Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala元组选项_Scala_Tuples_Option - Fatal编程技术网

Scala元组选项

Scala元组选项,scala,tuples,option,Scala,Tuples,Option,如果我有类似的Scala tuple选项: (Some(1), None) (None, Some(1)) (None, None) 我希望总是提取“Some”值,如果它存在的话,否则就得到None。模式匹配的唯一方法是什么 这应该有效: def f(t: (Option[Int], Option[Int])): Option[Int] = t match { case (Some(n), _) => Some(n) case (_, Some(n)) => Some(n

如果我有类似的Scala tuple选项:

(Some(1), None)
(None, Some(1))
(None, None) 
我希望总是提取“Some”值,如果它存在的话,否则就得到None。模式匹配的唯一方法是什么

这应该有效:

def f(t: (Option[Int], Option[Int])): Option[Int] = t match {
  case (Some(n), _) => Some(n)
  case (_, Some(n)) => Some(n)
  case _ => None
}
这是:

def oneOf[A](tup: (Option[A], Option[A])) = tup._1.orElse(tup._2)
这将返回已定义的第一个选项,如果两者都未定义,则返回None

编辑:

另一种表达相同事物的方式是

def oneOf[A](tup:  (Option[A], Option[A])) = 
   tup match { case (first, second) => first.orElse(second) }
它更长,但可能更可读

我希望总是提取
Some
值(如果存在),否则获取
None

您可以使用
orElse

def orOption[T](p: (Option[T], Option[T])): Option[T] = {
  val (o1, o2) = p
  o1 orElse o2
}
但是,这确实决定了如果存在两个
某些
值,该怎么办:

scala> orOption((Some(1), Some(2)))
res0: Option[Int] = Some(1)

您可能应该使用模式匹配,然后决定如果有两个
值或一些
值,比如抛出异常,该怎么办。或者,考虑对结果类型使用更好的编码,而不是<代码>选项< /> >

你想要从这些元组中得到什么结果?如果两者都是
Some
(Some(1),Some(2))
?@Psidom由于我的问题的性质,不可能出现这种情况。我想知道带选项的元组是否有类似于p/\!p==False。您想要的输出仍然是一个选项,对吗?@mfirry是的,我需要!可能重复的