2012-05-17 26 views
26

Me pareció interesante que this puzzler, específicamente este código:¿Qué mejoró Scala con la coincidencia de patrones en 2.10?

val (i, j): (Int, Int) = ("3", "4") 

se produce un error en tiempo de ejecución en Scala 2.9.1, pero falla en tiempo de compilación w/2.10 M3 (que es grande). Intento rastrear lo que viene en las nuevas versiones de Scala, pero no puedo conectar los puntos aquí. ¿Qué mejora llevó a este comportamiento más preciso?

+2

No tengo idea de por qué fallaría en el tiempo de ejecución y no compilaría el tiempo en ninguna versión de Scala. –

+0

Supongo que simplemente pasó por una prueba en algún lugar. De hecho, es algo gracioso: ayer estuve hablando con un devoto de Python sobre lo genial que es Scala, solo para descubrir hoy que Scala falla cuando se le presenta una tarea que es casi clásica en Python en la naturaleza. – pmcs

+1

'val (i: Int, j: Int) = (" 3 "," 4 ")' falla en tiempo de compilación en 2.9.1 – Rogach

Respuesta

10

Lo que está sucediendo es que el nuevo patrón de coincidencia es mucho más fácil de mejorar y mantener, porque no es un código de nido de ratas. El siguiente código de ejemplo también debe exhibir el mismo cambio:

("3", "4") match { case (i, j): (Int, Int) => /* whatever */ } 

Lo que pasa es Scala comprensión en tiempo de compilación que el patrón no puede ser igualada.

16

En la scala 2.10, el patrón de emparejamiento ha tenido una reescritura completa y ahora es el patrón virtual matcher. Read more about it!

+1

Bueno, la parte virtual es solo interna a menos que pase una bandera, iirc. La salida real no es virtual (es decir, no se implementa como llamadas en una mónada). –

+1

Bueno, sí. Pero el punto principal es que representa una re-escritura completa (lo que explicaría por qué su comportamiento puede haber cambiado) –

+0

¿Por qué debería el patrón matcher hacer alguna diferencia en este ejemplo? Esperaría que el compilador rechace el código durante la verificación de tipos antes de que llegue al patrón de coincidencia ... –

Cuestiones relacionadas