2014-11-09 4 views
8

Я вопрос по этому шаблону в Скале:Pattern Matching Аргументы функции

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

Я понимаю, как работает сопоставления с образцом и его syntaxis в Скале, но это выражение сводит меня с ума. Как complier знает, что x и y являются аргументами функции и соответствия шаблону на них?

ответ

9

Правила для этого определены в разделе 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) => ...