¿Por qué los lenguajes de programación generan firmas de métodos sin tener en cuenta el tipo de retorno?

11

He trabajado con muchos idiomas que no generan una firma de método basada en el tipo de retorno. También he trabajado con uno (¿quizás algunos?) Que sí. Los que no me han dado problemas en el pasado (como aquí ). ¿Por qué los lenguajes de programación generan firmas de métodos sin tener en cuenta el tipo de retorno?

Actualización: me refiero específicamente a los idiomas compilados estáticamente escritos

Charles Lambert
fuente
Esta es una suposición muy infundada, pero supongo que tiene algo que ver con la dificultad de la implementación del compilador y / o el soporte de herramientas.
Charles Lambert el
En Haskell, puede usar las clases de tipos para hacer básicamente funciones que dependen del tipo de retorno. I <3 Haskell: D: D: D
Thomas Eding

Respuestas:

5

No encajaría bien con la conversión de tipos y las jerarquías de tipos. Si tiene dos versiones de un método, una de las cuales devuelve el tipo A y otra que devuelve el tipo B, tiene problemas cuando:

  • A o B son subtipos entre sí, y usted asigna el valor de retorno al que es el supertipo.
  • A y B tienen un supertipo común, y usted asigna a dicho valor de supertipo.

Podría solucionar esto con los lanzamientos, pero eso requeriría escribir tanto como cambiar el nombre de una de las funciones. También puede registrar un error del compilador cuando la llamada es ambigua, en cuyo caso el usuario debe invertir una cantidad similar de esfuerzo.

jprete
fuente
1
He trabajado con idiomas que incluyen el tipo de retorno en la firma. Lanzar por todo el lugar no es un problema como usted indica. En su ejemplo específico, no necesitaría evitar esto con los moldes. Si A y B (subtipos de C) tienen la misma operación, entonces debe declararse en C. Si el tipo de retorno es diferente para A que para B: en la mayoría de los casos está tratando de devolver un subtipo de C. Simplemente agregue otro método en el subtipo que devuelva el subtipo e implemente la versión de C para llamar al que tiene el subtipo específico. Ahora no tienes que echar por todo el lugar.
Charles Lambert el
@Charles Lambert: no es una operación en las clases A, B o C. Son dos funciones con el mismo nombre y lista de parámetros, una de las cuales devuelve algo de tipo A y la otra devuelve algo de tipo B. Esta pregunta se aplica a más que solo sistemas OOP, así que respondí en función de tipos y funciones generales. Además, no entiendo qué pretende lograr su ejemplo de refutación; Se requieren más detalles para que pueda responder.
jprete
Un comentario es demasiado corto para un ejemplo. pastebin.com/JR39PKs0 básicamente los idiomas que incluyen el tipo de retorno en la firma ya han encontrado formas de aliviar el problema que está describiendo. Ya sea convención de codificación, o simplemente práctica estándar. También es de destacar que no mucho de lo que escribe justificaría la creación de métodos que difieren solo en el tipo de retorno. Así que de nuevo, no estarías lidiando con esto muy a menudo
Charles Lambert el
¿Sería difícil tener una regla de que solo se puede declarar un método "primario" para cualquier firma de argumento dada, pero se podría declarar un número arbitrario de métodos secundarios, y un compilador debe realizar una sobrecarga identificando primero una firma de argumento para la cual un ¿existe un método primario y luego verifica los métodos secundarios en un orden específico para ver si alguno de estos métodos era una coincidencia inequívocamente mejor (o sería utilizable incluso si el primario no lo fuera)?
supercat
3

Porque puede llamar a un método y no asignar su resultado.

Quirón
fuente
3
No en todos los idiomas.
Jörg W Mittag el
@Jorg ¿Qué idioma te gusta?
Quirón
1
f # es un idioma. Comúnmente se ve foo -> ignorar donde ignorar es un método con tipo de unidad de retorno que es similar al vacío
Charles Lambert
Ada es un mejor ejemplo. Ese lenguaje también usa tipos de retorno como parte de la firma también.
Charles Lambert
-4

Regla general: los lenguajes fuertemente tipados generalmente vinculan la firma del método a un tipo de retorno. Los idiomas débilmente escritos no.
No conozco C #, pero supongo que el problema podría deberse a la forma en que C # maneja los genéricos. Podría estar creando un método totalmente diferente para el genérico, en cuyo caso son realmente dos métodos diferentes.

CMR
fuente
1
Tengo curiosidad por saber a cuál de estos idiomas fuertemente tipados se refiere. No conozco ninguno, y sé que C ++ prohíbe explícitamente la resolución al tipo de retorno.
greyfade
2
-1 Si va a dar una regla general que aparentemente es incorrecta con un solo ejemplo que la viola, debe seguirla con todos los demás ejemplos en los que se cumple la regla.
@greyfade, mi punto era que en los idiomas de tipo débil la asignación no se verifica en el momento de la compilación. De acuerdo, eso podría no ser pertinente aquí.
CMR
Su punto está oscurecido por su afirmación inexacta de que "los idiomas fuertemente tipados generalmente se unen ... a un tipo de retorno".
greyfade