La coincidencia de patrones toma la entrada y la descompone con una función unapply
. Entonces, en su caso, unapply(4)
tendría que devolver los dos números que suman 4. Sin embargo, hay muchos pares que suman 4, por lo que la función no sabría qué hacer.
Lo que necesita es que el 2
sea accesible de alguna manera para la función unapply
. Una clase de caso especial que almacena el 2
trabajaría para esto:
case class Sum(addto: Int) {
def unapply(i: Int) = Some(i - addto)
}
val Sum2 = Sum(2)
val Sum2(x) = 5 // x = 3
(que sería bueno para ser capaz de hacer algo como val Sum(2)(y) = 5
de compacidad, pero Scala no permite extractores parametrizados; ver here.)
[EDIT: Esto es un poco tonto, pero en realidad se podría hacer lo siguiente también:
val `2 +` = Sum(2)
val `2 +`(y) = 5 // y = 3
]
EDIT: la razón por la cual funciona head::tail
es que hay exactamente una forma de dividir el encabezado de la cola de una lista.
No hay nada intrínsecamente especial acerca ::
frente +
: usted podría utilizar +
si has tenido una idea predeterminada de cómo lo quería romper un número. Por ejemplo, si desea +
en el sentido de "dividir a la mitad", entonces se podría hacer algo como:
object + {
def unapply(i: Int) = Some(i-i/2, i/2)
}
y utilizarlo como:
scala> val a + b = 4
a: Int = 2
b: Int = 2
scala> val c + d = 5
c: Int = 3
d: Int = 2
EDIT: Por último, this explica que, cuando coincidencia de patrón, A op B
significa lo mismo que op(A,B)
, lo que hace que la sintaxis se vea bien.
¿Por qué no usar 'Y-2' (cuando y = 4)? –
Esto es más una curiosidad, así que no tengo ningún ejemplo específico, pero imaginé que esto sería bueno para las clases más complejas. – Dylan