tipos textual teoria que proceso lenguaje inferencia ejemplo concepto clasificacion caracteristicas scala type-inference

scala - textual - Inferencia de tipo en el tipo de retorno de método



teoria de la inferencia ejemplo (4)

Aumentaría la complejidad del compilador (y el lenguaje). Es realmente funky hacer inferencia de tipo en algo así. Al igual que con cualquier tipo de inferencia relacionada, todo funciona mejor cuando tienes una sola expresión. Las declaraciones de devolución dispersas crean efectivamente una gran cantidad de ramificaciones implícitas que se vuelven muy pegajosas para unificar. No es que sea particularmente difícil , solo pegajoso. Por ejemplo:

def foo(xs: List[Int]) = xs map { i => return i; i }

¿Qué, te pregunto, infiere el compilador aquí? Si el compilador hiciera una inferencia con declaraciones de retorno explícitas, tendría que ser Any . De hecho, una gran cantidad de métodos con declaraciones de devolución explícitas terminarán devolviendo Any , incluso si no se obtiene con declaraciones no locales. Como he dicho, pegajoso.

Y además de eso, esta no es una característica del lenguaje que debería ser alentada. Los retornos explícitos no mejoran la claridad del código a menos que haya un solo retorno explícito y eso al final de la función. El motivo es bastante fácil de ver si ve las rutas de código como un gráfico dirigido. Como dije anteriormente, los retornos dispersos producen una gran cantidad de ramificaciones implícitas que producen hojas extrañas en su gráfico, 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) y su código será mucho más funcional si no confía en las declaraciones de return efectos secundarios para producir valores.

Entonces, al igual que varias otras características "desalentadas" en Scala (por ejemplo, como asInstanceOf lugar de as ), los diseñadores del lenguaje hicieron una elección deliberada para hacer las cosas menos agradables. Esto se combinó con la complejidad que introduce en la inferencia de tipos y la inutilidad práctica de los resultados en todos los escenarios, excepto en los más ideados. Simplemente no tiene ningún sentido que Scalac intente este tipo de inferencia.

Moraleja de la historia: ¡aprende a no dispersar tus devoluciones! Es un buen consejo en cualquier idioma, no solo en Scala.

¿Por qué Scala no puede inferir el tipo de retorno del método cuando se usa una declaración de return explícita en el método?

Por ejemplo, ¿por qué se compila el siguiente código?

object Main { def who = 5 def main(args: Array[String]) = println(who) }

Pero lo siguiente no lo hace.

object Main { def who = return 5 def main(args: Array[String]) = println(who) }


Dado esto (2.8.Beta1):

object Main { def who = return 5 def main(args: Array[String]) = println(who) } <console>:5: error: method who has return statement; needs result type def who = return 5

... no parece inadvertido.


El tipo de retorno de un método es el tipo de la última instrucción en el bloque que lo define o el tipo de expresión que lo define, en ausencia de un bloque.

Cuando utiliza return dentro de un método, introduce otra declaración de la que puede devolver el método. Eso significa que Scala no puede determinar el tipo de return en el punto en que se encuentra. En su lugar, debe continuar hasta el final del método, luego combinar todos los puntos de salida para inferir sus tipos, y luego regresar a cada uno de estos puntos de salida y asignar sus tipos.

Si lo hace, aumentaría la complejidad del compilador y lo ralentizaría, para la única ventaja de no tener que especificar el tipo de retorno cuando se usa el return . En el sistema actual, por otro lado, inferir el tipo de retorno viene gratis de la inferencia de tipo limitada que Scala ya usa.

Entonces, al final, en el equilibrio entre la complejidad del compilador y las ganancias que se obtendrían, se consideraba que este último no valía el primero.


No estoy seguro de por qué. Tal vez sólo para desalentar el uso de la declaración de return . :)