如何撰写试用不同类型的参数?

时间:2014-03-20 01:31:00

标签: scala

如果我在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对象?

4 个答案:

答案 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失败,则第二个不会被计算。