如果我在flatMap中链接两个具有不同类型的Try方法,例如:
def first = Try { "the answer is..." }
def second = Try { 42 }
first flatMap second match {
case Success(_) => println("Wheeee!!!!")
case Failure(_) => println("DUH!")
}
我会得到type mismatch; found : scala.util.Try[Int] required: String => scala.util.Try[?]
我可以通过将“第二”声明更改为:
来解决这个问题def second(s:String) = Try { 42 }
但是如何在没有“强迫”无用的参数的情况下链接第一个和第二个Try对象?
答案 0 :(得分:3)
错误意味着传递给flatMap的函数类型错误:type mismatch; found : scala.util.Try[Int] required: String => scala.util.Try[?]
这可以通过提供一个从x: String
传递first
的函数来修复:
first flatMap( x => second) match {
case Success(_) => println("Wheeee!!!!")
case Failure(_) => println("DUH!")
} //> Wheeee!!!!
答案 1 :(得分:2)
只需使用for
理解:
for (f <- first; s <- second) yield s
答案 2 :(得分:2)
或许添加不太明显:
if (first.isSuccess && second.isSuccess) "whoopie" else "nope"
或
implicit def `success is true`[A](t: Try[A]): Boolean = t.isSuccess
println { if (first && second) "whoopie" else "nope" }
愿你的所有副作用都是本地的。
答案 3 :(得分:1)
您可以将它们组合成元组并匹配两者:
(first, second) match {
case (Succcess(_), Success(_)) => ...
...
case (Failure(_), Failure(_)) => ...
}
flatMap
是一个具有完全不同语义的操作,如果您的第一个Try
失败,则第二个不会被计算。