2010-09-16 2 views
8

У меня был список Scala кортежи, как в следующем:Неожиданное модель 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 

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

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

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

+0

Этот синтаксис хорош, но для таких вещей я предпочитаю l.map (t => t._1 + t._2). Я думаю, что нет ничего плохого в синтаксисе x._1 – Landei

ответ

19

См. Раздел 8.5 ссылки на язык, «Образцы, соответствующие анонимным функциям».

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

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

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

Ожидаемый deternines типа является ли это в переводе на 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

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

1

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

+0

Не точно. В первом примере определяется * метод * 'addTuple'. Затем компилятор использует * partial application * для генерации эквивалентной функции, которая передается методу 'map', вызывается на' l'. –

Смежные вопросы