Scala 为什么与类型为tuple的提取器一起使用的for comprehension会导致“filter”上出现编译警告?
给定以下代码snippelt: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
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 }