Perché i linguaggi di programmazione generano firme dei metodi indipendentemente dal tipo restituito?


11

Ho lavorato con molte lingue che non generano una firma del metodo basata sul tipo restituito. Ho anche lavorato con uno (forse alcuni?) Che lo fanno. Quelli che non mi hanno dato problemi in passato (come qui ). Perché i linguaggi di programmazione generano firme dei metodi indipendentemente dal tipo restituito?

Aggiornamento: mi riferisco specificamente alle lingue compilate staticamente


Questa è un'ipotesi molto infondata, ma suppongo che abbia qualcosa a che fare con la difficoltà dell'implementazione del compilatore e / o del supporto degli strumenti.
Charles Lambert,

In Haskell è possibile utilizzare i caratteri tipografici per rendere sostanzialmente le funzioni che dipendono dal tipo di ritorno. I <3 Haskell: D: D: D
Thomas Eding,

Risposte:


5

Non si combina bene con la tipografia e le gerarchie di tipi. Se si dispone di due versioni di un metodo, una delle quali restituisce il tipo A e una che restituisce il tipo B, si verificano problemi quando:

  • A o B sono sottotipi l'uno dell'altro e si assegna il valore restituito a quello che è il supertipo.
  • A e B hanno un supertipo comune e si assegna a tale valore di supertipo.

Potresti aggirare questo problema con i cast, ma ciò richiederebbe tanto digitando quanto rinominando una delle funzioni. È inoltre possibile registrare un errore del compilatore quando la chiamata è ambigua, nel qual caso l'utente deve dedicare sforzi simili.


1
Ho lavorato con lingue che includono il tipo restituito nella firma. Casting dappertutto non è un problema come indichi. Nel tuo esempio specifico non avresti bisogno di aggirare questo problema con i cast. Se A e B (sottotipi di C) hanno entrambi la stessa operazione, allora dovrebbe essere dichiarato in C. Se il tipo di ritorno è diverso per A che per B: Nella maggior parte dei casi sta cercando di restituire un sottotipo di C. Semplicemente aggiungere un altro metodo nel sottotipo che restituisce il sottotipo e implementare la versione da C per chiamare quella con il sottotipo specifico. Ora non devi lanciare dappertutto.
Charles Lambert,

@Charles Lambert: Non è un'operazione sulle classi A, B o C. Sono due funzioni con lo stesso nome e l'elenco dei parametri, una delle quali restituisce qualcosa di tipo A e l'altra restituisce qualcosa di tipo B. Questa domanda si applica a qualcosa di più dei semplici sistemi OOP, quindi ho risposto in base a tipi e funzioni generali. Inoltre, non capisco che cosa intende realizzare il tuo esempio di confutazione; sono necessari ulteriori dettagli per rispondere.
giovedì

Un commento è troppo breve per un esempio. pastebin.com/JR39PKs0 sostanzialmente le lingue che includono il tipo restituito nella firma hanno già escogitato dei modi per alleviare il problema che stai descrivendo. Che si tratti di una convenzione di codifica o semplicemente di una pratica standard. Inoltre, non molto di ciò che scrivi giustificherebbe la creazione di metodi che differiscono solo per il tipo restituito. Quindi, ancora una volta, non ti occuperesti di questo molto spesso
Charles Lambert,

Ci sarebbe qualche difficoltà ad avere una regola secondo la quale un solo metodo "primario" può essere dichiarato per una data firma di argomento, ma un numero arbitrario di metodi secondari potrebbe essere dichiarato e un compilatore dovrebbe eseguire un sovraccarico identificando prima una firma di argomento per la quale un esiste un metodo primario, e quindi controllando i metodi secondari in un ordine specificato per vedere se tale metodo era una corrispondenza inequivocabilmente migliore (o sarebbe utilizzabile anche se quello primario non lo fosse)?
supercat

3

Perché puoi chiamare un metodo e non assegnarne il risultato.


3
Non in tutte le lingue.
Jörg W Mittag,

@Jorg Ti piace quale lingua?
Chirone,

1
f # è una lingua. Di solito vedi foo -> ignora dove ignore è un metodo con tipo di unità di ritorno che è simile al vuoto
Charles Lambert

Ada è un esempio migliore. Quella lingua utilizza effettivamente anche i tipi restituiti come parte della firma.
Charles Lambert,

-4

Regola empirica: le lingue fortemente tipizzate solitamente associano la firma del metodo a un tipo restituito. Le lingue debolmente dattilatte no.
Non conosco C #, ma presumo che il problema potrebbe essere dovuto al modo in cui C # gestisce i generici. Potrebbe essere la creazione di un metodo totalmente diverso per quello generico, nel qual caso si tratta in realtà di due metodi diversi.


1
Sono curioso di sapere a quale di queste lingue fortemente tipizzate ti riferisci? Non ne conosco nessuno e so che C ++ proibisce esplicitamente la risoluzione del tipo restituito.
Greyfade,

2
-1 Se hai intenzione di dare una regola empirica apparentemente sbagliata con un singolo esempio che la viola, dovresti seguirla con tutti gli altri esempi in cui la regola è rispettata.

@greyfade, il mio punto era che nelle lingue debolmente tipizzate il compito non veniva verificato al momento della compilazione. D'accordo, potrebbe non essere pertinente qui.
CMR

Il tuo punto è oscurato dalla tua affermazione inesatta secondo cui "le lingue fortemente tipizzate di solito si legano ... a un tipo di ritorno".
greyfade,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.