Por que as linguagens de programação geram assinaturas de método sem levar em consideração o tipo de retorno?

11

Eu trabalhei com muitos idiomas que não geram uma assinatura de método com base no tipo de retorno. Eu também trabalhei com um (talvez alguns?) Que o faça. Os que não me deram problemas no passado (como aqui ). Por que as linguagens de programação geram assinaturas de método sem levar em consideração o tipo de retorno?

Atualização: estou me referindo especificamente a idiomas compilados estaticamente

Charles Lambert
fonte
Este é um palpite muito infundado, mas acho que tem algo a ver com a dificuldade de implementação do compilador e / ou suporte a ferramentas.
26611 Charles Lambert
No Haskell, você pode usar classes de tipos para basicamente criar funções dependentes do tipo de retorno. Eu <3 Haskell: D: D: D
Thomas Eding

Respostas:

5

Não combinaria bem com a conversão de tipos e hierarquias de tipos. Se você possui duas versões de um método, uma das quais retorna o tipo A e a outra, o tipo B, você enfrenta problemas quando:

  • A ou B são subtipos um do outro e você atribui o valor de retorno àquele que é o supertipo.
  • A e B têm um supertipo comum e você atribui a esse valor.

Você poderia contornar isso com projeções, mas isso exigiria tanto digitação quanto renomear uma das funções. Você também pode registrar um erro do compilador quando a chamada for ambígua; nesse caso, o usuário precisará gastar esforços semelhantes.

jprete
fonte
1
Eu trabalhei com idiomas que incluem o tipo de retorno na assinatura. Transmitir por todo o lugar não é um problema, como você indica. No seu exemplo específico, você não precisaria contornar isso com elencos. Se A e B (subtipos de C) tiverem a mesma operação, deverá ser declarado em C. Se o tipo de retorno for diferente para A e para B: Na maioria dos casos, ele está tentando retornar um subtipo de C. Você simplesmente adicione outro método no subtipo que retorne o subtipo e implemente a versão de C para chamar aquele com o subtipo específico. Agora você não precisa se espalhar por todo o lugar.
Charles Lambert
@ Charles Lambert: Não é uma operação nas classes A, B ou C. São duas funções com o mesmo nome e lista de parâmetros, uma das quais retorna algo do tipo A e a outra retorna algo do tipo B. Esta pergunta se aplica para mais do que apenas sistemas OOP, então eu respondi com base em tipos e funções gerais. Além disso, não entendo o que seu exemplo de refutação pretende realizar; mais detalhes são necessários para eu responder a isso.
jprete
Um comentário é muito curto para um exemplo. pastebin.com/JR39PKs0 basicamente os idiomas que incluem o tipo de retorno na assinatura já criaram maneiras de aliviar o problema que você está descrevendo. Seja convenção de codificação ou apenas prática padrão. Observe também que pouco do que você escreve justificaria a criação de métodos que diferem apenas no tipo de retorno. Então, novamente, você não estaria lidando com isso com muita frequência
Charles Lambert
Haveria alguma dificuldade em ter uma regra de que apenas um método "primário" pode ser declarado para qualquer assinatura de argumento, mas um número arbitrário de métodos secundários pode ser declarado e um compilador deve realizar uma sobrecarga identificando primeiro uma assinatura de argumento para a qual um existe o método primário e, em seguida, verifica os métodos secundários em alguma ordem especificada para ver se algum desses métodos era uma correspondência inequivocamente melhor (ou seria utilizável mesmo que o principal não fosse)?
Supercat
3

Porque você pode chamar um método e não atribuir seu resultado.

Quíron
fonte
3
Não em todas as línguas.
Jörg W Mittag
@Jorg Como em qual idioma?
Quíron
1
f # é um idioma. Você geralmente vê foo -> ignorar onde ignorar é um método com tipo de retorno da unidade, que é semelhante ao vazio
Charles Lambert
Ada é um exemplo melhor. Na verdade, esse idioma também usa tipos de retorno como parte da assinatura.
26711 Charles Lambert
-4

Regra geral: linguagens fortemente tipadas geralmente vinculam a assinatura do método a um tipo de retorno. Idiomas de tipo fraco não.
Não conheço C #, mas presumo que o problema possa ser devido à maneira como o C # lida com genéricos. Pode estar criando um método totalmente diferente para o genérico; nesse caso, eles são realmente dois métodos diferentes.

CMR
fonte
1
Estou curioso para qual dessas linguagens fortemente tipadas você se refere? Não conheço ninguém e sei que o C ++ proíbe explicitamente a resolução para o tipo de retorno.
greyfade
2
-1 Se você for dar uma regra prática que esteja ostensivamente errada com um único exemplo que a viola, siga-o com todos os outros exemplos em que a regra é respeitada.
@greyfade, meu argumento era que, em idiomas de tipo fraco, a atribuição não é verificada no momento da compilação. Concorde que isso pode não ser pertinente aqui.
CMR
Seu argumento é obscurecido por sua afirmação imprecisa de que "linguagens fortemente tipadas geralmente se ligam ... a um tipo de retorno".
greyfade