模式匹配函数参数

时间:2014-11-09 11:33:28

标签: scala pattern-matching

我在scala中有关于此模式匹配的问题:

val div: (Double, Double) => Double = {
  case (x, y) if y != 0 => x / y
}

我已经理解了模式匹配在scala中的工作原理及其语法,但这个表达式让我发疯。编译器如何知道x和y是函数和模式匹配的参数?

1 个答案:

答案 0 :(得分:10)

此规则在Scala语言规范的8.5 "Pattern Matching Anonymous Functions"部分中定义。如果使用具有模式匹配的匿名函数,则必须部分提供该类型。你这样做是因为类型是(Double, Double) => Double,这是Function2[Double, Double, Double]的缩写。

现在:

  

如果期望的类型是scala.Function k [S1,…,Sk, R],则表达式被认为等同于匿名函数:

(x1:S1,…,xk:Sk) => (x1,…,xk) match {
  case p1 => b1 … case pn => bn
}

所以无论你的函数是什么,模式匹配都会传递函数参数的元组,因此你可以使用常规的元组提取器语法。

所以你的例子是

的缩写
val div: (Double, Double) => Double = (a, b) => (a, b) match {
  case (x, y) if y != 0 => x / y
}

val div = (a: Double, b: Double) => (a, b) match {
  case (x, y) if y != 0 => x / y
}

提取器参数xy命名取决于您的想象力。您决定如何调用提取器的结果元素,您也可以编写case (foo, bar) => ...