Pourquoi les langages de programmation génèrent-ils des signatures de méthode sans égard au type de retour?


11

J'ai travaillé avec de nombreux langages qui ne génèrent pas de signature de méthode basée sur le type de retour. J'ai également travaillé avec un (peut-être certains?) Qui le font. Ceux qui ne m'ont pas posé de problèmes dans le passé (comme ici ). Pourquoi les langages de programmation génèrent-ils des signatures de méthode sans égard au type de retour?

Mise à jour: je me réfère spécifiquement aux langues compilées de manière statique


C'est une supposition très infondée, mais je suppose que cela a quelque chose à voir avec la difficulté de la mise en œuvre du compilateur et / ou de la prise en charge des outils.
Charles Lambert

Dans Haskell, vous pouvez utiliser des classes de types pour rendre les fonctions dépendantes du type de retour. I <3 Haskell: D: D: D
Thomas Eding

Réponses:


5

Il ne conviendrait pas bien à la conversion de types et aux hiérarchies de types. Si vous avez deux versions d'une méthode, dont l'une renvoie le type A et l'autre qui renvoie le type B, vous rencontrez des problèmes lorsque:

  • A ou B sont des sous-types l'un de l'autre et vous affectez la valeur de retour à celle qui est le super-type.
  • A et B ont un sur-type commun et vous les affectez à une telle valeur de sur-type.

Vous pouvez contourner ce problème avec les transtypages, mais cela nécessiterait autant de saisie que le changement de nom d'une des fonctions. Vous pouvez également enregistrer une erreur de compilation lorsque l'appel est ambigu, auquel cas l'utilisateur doit dépenser des efforts similaires.


1
J'ai travaillé avec des langues qui incluent le type de retour dans la signature. Casting partout n'est pas un problème comme vous l'indiquez. Dans votre exemple spécifique, vous n'auriez pas besoin de contourner cela avec des lancers. Si A et B (sous-types de C) ont tous les deux la même opération, alors elle doit être déclarée en C. Si le type de retour est différent pour A que pour B: Dans la plupart des cas, il essaie de renvoyer un sous-type de C. Vous simplement ajoutez une autre méthode dans le sous-type qui renvoie le sous-type et implémentez la version de C pour appeler celle avec le sous-type spécifique. Maintenant, vous n'avez plus besoin de lancer partout.
Charles Lambert

@Charles Lambert: Ce n'est pas une opération sur les classes A, B ou C. Ce sont deux fonctions avec le même nom et la même liste de paramètres, dont l'une renvoie quelque chose de type A et l'autre qui renvoie quelque chose de type B. Cette question s'applique à plus que des systèmes POO, j'ai donc répondu en fonction des types et des fonctions généraux. De plus, je ne comprends pas ce que votre exemple de réfutation est censé accomplir; il me faut plus de détails pour y répondre.
jprete

Un commentaire est trop court pour un exemple. pastebin.com/JR39PKs0 essentiellement les langues qui incluent le type de retour dans la signature ont déjà trouvé des moyens pour atténuer le problème que vous décrivez. Que ce soit la convention de codage ou simplement une pratique standard. Notez également que peu de ce que vous écrivez justifierait la création de méthodes qui ne diffèrent que par le type de retour. Encore une fois, vous ne vous en occuperiez pas très souvent
Charles Lambert

Y aurait-il une difficulté à avoir une règle selon laquelle une seule méthode "principale" peut être déclarée pour une signature d'argument donnée, mais un nombre arbitraire de méthodes secondaires pourrait être déclaré, et un compilateur devrait effectuer une surcharge en identifiant d'abord une signature d'argument pour laquelle un existe-t-il une méthode primaire, et puis vérifier les méthodes secondaires dans un certain ordre spécifié pour voir si une telle méthode était une meilleure correspondance sans ambiguïté (ou serait utilisable même si la principale ne l'était pas)?
supercat

3

Parce que vous pouvez appeler une méthode et ne pas attribuer son résultat.


3
Pas dans toutes les langues.
Jörg W Mittag

@Jorg Comme quelle langue?
Chiron

1
f # est une langue. Vous voyez généralement foo -> ignore où ignore est une méthode avec le type d'unité de retour qui est similaire à void
Charles Lambert

Ada est un meilleur exemple. Ce langage utilise également des types de retour dans le cadre de la signature.
Charles Lambert

-4

Règle générale: les langages fortement typés lient généralement la signature de la méthode à un type de retour. Les langues faiblement typées ne le font pas.
Je ne connais pas C #, mais je suppose que le problème pourrait être dû à la façon dont C # gère les génériques. Il pourrait s'agir de créer une méthode totalement différente de la méthode générique, auquel cas il s'agit en réalité de deux méthodes différentes.


1
Je suis curieux de savoir à laquelle de ces langues fortement typées vous référez-vous? Je n'en connais aucun, et je sais que C ++ interdit explicitement la résolution du type de retour.
greyfade

2
-1 Si vous allez donner une règle empirique qui est manifestement erronée avec un seul exemple qui la viole, vous devez suivre cela avec tous les autres exemples où la règle est respectée.

@greyfade, mon point était que dans les langues faiblement typées, l'affectation n'est pas vérifiée au moment de la compilation. D'accord, cela pourrait ne pas être pertinent ici.
CMR

Votre argument est occulté par votre affirmation inexacte selon laquelle "les langues fortement typées se lient généralement ... à un type de retour".
greyfade
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.