2010-09-16 17 views
8

Tenía una lista de Scala tuplas como la siguiente:inesperado patrón de Scala sintaxis de coincidencia

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

y quería hacer un mapa en una lista de Int, donde cada elemento es la suma de los Entrs en los correspondientes tupla Además, no me quiero usar a usar la notación x._1 por lo que resolvió el problema con un patrón de coincidencia como esta

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

Hacer que obtuve la lista R: Lista [Int] = Lista (3, 5, 7) como se esperaba. En este punto, casi por casualidad, descubrí que puedo lograr el mismo resultado con una forma abreviada como la siguiente:

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

No puedo encontrar ninguna referencia a esta sintaxis en la documentación que tengo. ¿Eso es normal? ¿Me estoy perdiendo algo trivial?

+0

Esta sintaxis es agradable, pero para tales cosas, prefiero l.map (t => t._1 + t._2). Creo que no hay nada de malo en la sintaxis x._1 – Landei

Respuesta

19

Consulte la Sección 8.5 de la referencia del lenguaje, "Funciones coincidentes con el patrón".

una función anónima puede ser definido por una secuencia de casos

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

que aparecen como una expresión sin un partido anterior. El tipo esperado de tal expresión debe ser definido en parte. Debe ser scala.Functionk[S1, ..., Sk, R] para algunos k> 0 o scala.PartialFunction[S1, R], donde los tipos de argumento S1, ..., Sk deben estar completamente determinados, pero el tipo de resultado R puede ser indeterminado.

Los deternines tipo esperado si esto se traduce a una FunctionN o 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> 
1

Método map acepta una función. En el primer ejemplo, usted crea una función, la asigna a una variable y la pasa al método map. En el segundo ejemplo, pasa su función creada directamente, omitiendo asignarla a una variable. Estás haciendo exactamente lo mismo.

+0

No precisamente. En el primer ejemplo, se define el * método * 'addTuple'. El compilador luego usa * la aplicación parcial * para generar una función equivalente que se pasa al método 'map' invocado en' l'. –

Cuestiones relacionadas