Scala 为什么与类型为tuple的提取器一起使用的for comprehension会导致“filter”上出现编译警告?

Scala 为什么与类型为tuple的提取器一起使用的for comprehension会导致“filter”上出现编译警告?,scala,for-comprehension,extractor,Scala,For Comprehension,Extractor,给定以下代码snippelt: import scala.util.Try def foo(x:Int) : (Int, String) = { (x+1, x.toString) } def main(args: Array[String]) : Unit = { val r1: Try[(Int, String)] = for { v <- Try { foo(3) } } yield v val r2: Try[(Int, String)] = for

给定以下代码snippelt:

import scala.util.Try

def foo(x:Int) : (Int, String) = {
  (x+1, x.toString)
}

def main(args: Array[String]) : Unit = {
  val r1: Try[(Int, String)] = for {
    v <- Try { foo(3) }
  } yield v

  val r2: Try[(Int, String)] = for {
    (i, s)  <- Try { foo(3) } // compile warning refers to this line
  } yield (i, s)
}
导入scala.util.Try
def foo(x:Int):(Int,String)={
(x+1,x.toString)
}
def main(参数:数组[字符串]):单位={
val r1:尝试[(Int,String)]=for{

v似乎
Try.withFilter
仅在2.11中添加(参见和)

在中使用
withFilter
代替
filter
,以便于理解,因为它是惰性的,您可以在中阅读更全面的比较

你的第二个理解目标类似于:

Try(foo(3)).withFilter {
  case (i, s) => true
  case _      => false
} map(identity)
因为Scala 2.10.5中不存在
Try.withFilter
,它会退回到使用
filter
(这会创建一个新的
Try


编辑:在您的案例中,为什么需要带过滤器的
并不明显,因为您实际上并没有使用
(i,s)
模式匹配进行过滤

如果你在下面写了一篇关于理解的文章,那么当你在一篇关于理解的文章的左边添加一个模式匹配时,你(可以)过滤就更清楚了

for {
  (i, "3") <- Try(foo(3))
} yield i

正如您所看到的,
withFilter
不仅在添加if防护时使用,而且在模式匹配时也会使用。

您使用的是哪个Scala版本?@Peterneens:很好的提示!2.10.5您能详细说明一下为什么使用withFilter吗?为什么有必要?
for {
  (i, "3") <- Try(foo(3))
} yield i
Try(foo(3)) withFilter {
  case (i, "3") => true
  case _        => false
} map { case (i, "3") => i }