Aumentaría la complejidad del compilador (y del lenguaje). Es realmente divertido hacer inferencias tipo sobre algo así. Como con cualquier tipo de inferencia relacionada, todo funciona mejor cuando tienes una sola expresión. Las declaraciones de rendimiento dispersas crean efectivamente una gran cantidad de ramificaciones implícitas que se vuelven muy adhesivas para unificar. No es que sea particularmente difícil, simplemente pegajoso. Por ejemplo:
def foo(xs: List[Int]) = xs map { i => return i; i }
Qué, te pido, no inferir el compilador aquí? Si el compilador hiciera inferencia con declaraciones de devolución explícitas, necesitaría ser Any
. De hecho, muchos métodos con declaraciones explícitas de devolución terminarían devolviendo Any
, incluso si no se vuelve furtivo con devoluciones no locales. Como dije, pegajoso.
Y además de eso, esta no es una función de idioma que deba ser alentada. Los retornos explícitos hacen no mejoran la claridad del código a menos que haya solo un retorno explícito y que al final de la función. La razón es bastante fácil de ver si ve las rutas del código como un gráfico dirigido. Como dije antes, los retornos dispersos producen una gran cantidad de ramificaciones implícitas que producen hojas extrañas en su gráfica, así como muchas rutas adicionales en el cuerpo principal. Es simplemente funky. El flujo de control es mucho más fácil de ver si sus ramas son todas explícitas (coincidencia de patrones o expresiones if
) y su código será mucho más funcional si no se basa en declaraciones de efectos secundarios return
para producir valores.
Por lo tanto, al igual que varias otras características "desanimados" en Scala (por ejemplo, en lugar de asInstanceOf
as
), los diseñadores de la lengua hizo una elección deliberada para hacer las cosas menos agradable. Esto combinado con la complejidad que introduce en la inferencia de tipos y la inutilidad práctica de los resultados en todos los escenarios menos en los más elaborados. Simplemente no tiene sentido que Scalac intente este tipo de inferencia.
Moraleja de la historia: ¡aprende a no dispersar tus ganancias! Es un buen consejo en cualquier idioma, no solo en Scala.
Hola Daniel. No entiendo tu explicación Scala ya tiene que combinar múltiples expresiones y puntos de salida en funciones debido a las sentencias if/else. Y el lenguaje Scala tiene toneladas de cosas perversamente complejas que la mayoría de los programadores de Scala no entienden muy bien o usan (por ejemplo, covarianza/contravarianza, tipos estructurales, etc.). Esto agrega MUCHA complejidad al compilador; entonces "hace que el compilador sea más complejo" parece una respuesta débil. –
@UrbanVagabond Te perdiste la parte "gana para ser cabeza". El hecho de que algo sea complejo no significa que valga la pena agregarle más complejidad. Ahora, Scala no tiene que combinar múltiples expresiones y puntos de salida en sentencias if/else porque if/else es una expresión, no enunciados. Eso puede parecer cortar el pelo, pero la diferencia es muy real. –