我在scala中有关于此模式匹配的问题:
val div: (Double, Double) => Double = {
case (x, y) if y != 0 => x / y
}
我已经理解了模式匹配在scala中的工作原理及其语法,但这个表达式让我发疯。编译器如何知道x和y是函数和模式匹配的参数?
答案 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
}
提取器参数x
和y
的命名取决于您的想象力。您决定如何调用提取器的结果元素,您也可以编写case (foo, bar) => ...