Правила для этого определены в разделе 8.5 "Pattern Matching Anonymous Functions" Спецификации языка Scala. При использовании анонимной функции с сопоставлением с образцом тип должен быть частично предоставлен. Вы делаете это, говоря, что это (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) => ...