Неожиданный синтаксис сопоставления с образцом Scala - PullRequest
8 голосов
/ 17 сентября 2010

У меня был список кортежей Scala, подобный следующему:

val l = List((1,2),(2,3),(3,4))

и я хотел отобразить его в списке Int, где каждый элемент представляет собой сумму Ints в соответствующем кортеже. Я также не хотел использовать нотацию x._1, поэтому решил проблему с сопоставлением с шаблоном, как это

def addTuple(t: (Int, Int)) : Int = t match { 
    case (first, second) => first + second 
}
var r = l map addTuple

После этого я получил список r: List [Int] = List (3, 5, 7), как и ожидалось. В этот момент, почти случайно, я обнаружил, что могу достичь того же результата с помощью сокращенной формы, подобной следующей:

val r = l map {case(first, second) => first + second}

Я не могу найти ссылку на этот синтаксис в документации, которая у меня есть. Это нормально? Я что-то упускаю из виду?

Ответы [ 3 ]

19 голосов
/ 17 сентября 2010

См. Раздел 8.5 справочника по языку «Анонимные функции сопоставления с образцом».

Анонимная функция может быть определена последовательностью случаев

{case p1 =>b1 ... case pn => bn }

, которые появляются как выражение без предварительного соответствия.Ожидаемый тип такого выражения должен быть частично определен.Это должно быть либо scala.Functionk[S1, ..., Sk, R] для некоторых k> 0, либо scala.PartialFunction[S1, R], где типы аргументов S1, ..., Sk должны быть полностью определены, но тип результата R может быть неопределенным.

Ожидаемый тип определяет, будет ли это переведено в FunctionN или PartialFunction.

scala> {case x => x}  
<console>:6: error: missing parameter type for expanded function ((x0$1) => x0$1 match {
  case (x @ _) => x
})
       {case x => x}
       ^

scala> {case x => x}: (Int => Int)
res1: (Int) => Int = <function1>

scala> {case x => x}: PartialFunction[Int, Int]
res2: PartialFunction[Int,Int] = <function1>
4 голосов
/ 17 сентября 2010

{case(first, second) => first + second} трактуется как PartialFunction литерал. См. Примеры в разделе «Частичные функции» здесь: http://programming -scala.labs.oreilly.com / ch08.html или раздел 15.7 из Программирование в Scala .

1 голос
/ 17 сентября 2010

Метод map принимает функцию. В первом примере вы создаете функцию, присваиваете ее переменной и передаете методу map. Во втором примере вы передаете созданную функцию напрямую, не назначая ее переменной. Вы делаете то же самое.

...