Sto leggendo "The D Programming Language" di Andrei Alexandrescu e una frase mi ha sconcertato. Consideriamo tale codice (p.138):Cosa c'è di sbagliato nel tipo di modello e nella conversione di tipo implicito?
T[] find(T)(T[] haystack, T needle) {
while (haystack.length > 0 && haystack[0] != needle) {
haystack = haystack[1 .. $];
}
return haystack;
}
e chiamare (p.140):
double[] a = [ 1.0, 2.5, 2.0, 3.4 ];
a = find(a, 2); // Error! ' find(double[], int)' undefined
Spiegazione (paragrafo sotto il codice):
Se strabismo abbastanza duro , vediamo che l'intento del chiamante in questo caso era di avere
T = double
e beneficiare della bella conversione implicita daint
adouble
. Tuttavia, avere il tentativo linguistico combinatorio allo stesso tempo di conversioni implicite e deduzione di tipo è una proposizione azzardata nel caso generale, quindi D non tenta di fare tutto questo.
Sono perplesso perché un linguaggio come C# cerca di dedurre il tipo - se non può farlo, l'utente ottiene errore, ma se può, beh, funziona. C# vive con lui per diversi anni e non ho sentito nessuna storia di come questa caratteristica abbia rovinato la giornata di qualcuno.
E così le mie domande sono queste: quali pericoli sono coinvolti con i tipi di inferenza come nell'esempio sopra?
Vedo solo vantaggi, è facile scrivere funzioni generiche ed è facile chiamarlo. Altrimenti dovresti introdurre più parametri nella classe/funzione generica e scrivere vincoli speciali che esprimono le conversioni permesse solo per motivi di inferenza.
Quanto sopra sembra funzionare correttamente in 'dmd 2.066'. Immagino che abbiano deciso che la proposizione non era "rischiosa" come pensavano. – rcorre
Questa funzione è stata introdotta circa un anno fa in questo PR: https://github.com/D-Programming-Language/dmd/pull/3353 –