Ricerca sull'inferenza di tipo basata sul sito di chiamata?


9

Sto cercando di saperne di più sulla verifica del tipo di intero programma e sui sistemi di inferenza dei tipi che utilizzano le informazioni dai siti di chiamata delle funzioni per calcolare le informazioni sul tipo (oltre all'approccio standard dell'uso del corpo della funzione). Ad esempio, un tale algoritmo potrebbe usare una chiamata di funzione come foo(1)per dedurre che la funzione in fooaccetta argomenti interi. Ovviamente questo complicherebbe molto l'inferenza e renderebbe il controllo non modulare.

Comunque, non ho avuto molta fortuna a trovare alcuna ricerca su questo approccio, probabilmente perché non conosco la terminologia corretta per descrivere ciò di cui sto parlando. Qualche puntatore?


Quello che stai descrivendo ha accenni di inferenza di tipo bidirezionale, a meno che non mi sbagli. Descrivere ciò che si sta tentando di fare può tuttavia chiarire.
Dominic Mulligan,

Stai chiedendo perché cerchi un modo per specializzare le funzioni polimorfiche?
nponeccop,

Per lo più sto solo cercando di saperne di più sui sistemi di tipo davvero, e sì, stavo pensando principalmente a come gestire le funzioni polimorfiche (e le chiamate di metodo nei linguaggi OO, la stessa cosa). Sto cercando di identificare i termini giusti per questo in modo da poterlo leggere.
Derek Thurn,

Risposte:


11

Quasi tutti i sistemi con inferenza di tipo utilizzano le informazioni sul sito di chiamata per fare ciò. Gli esempi includono ML standard, OCaml, F # e Haskell. Molte altre lingue usano le informazioni sul sito di chiamata per inferire l'istanza dei parametri di tipo, come Java, C #, Scala e Typed Racket. Questo spesso si chiama "Inferenza del tipo locale".

Descriverei semplicemente ciò che stai cercando come "Type Inference", e probabilmente dovresti iniziare cercando quello che è comunemente noto come il sistema "Hindley-Milner". La pagina di Wikipedia offre una ragionevole introduzione e indicazioni ai documenti originali.

Il punto di partenza per Local Type Inference è il documento originale di Pierce e Turner, meglio leggibile nella versione TOPLAS 2000 ( ACM , PDF ).


La carta Pierce e Turner è stata molto illuminante, grazie. Sei a conoscenza di un'implementazione minima dell'algoritmo che descrivono nel codice? Penso che sarebbe molto interessante anche guardare, se esiste.
Derek Thurn,

Non conosco implementazioni minime. Ce n'è uno in Typed Racket e uno in Scala, ma entrambi implementano algoritmi sostanzialmente più complicati.
Sam Tobin-Hochstadt,

0

Puoi dare un'occhiata ai sistemi di tipi per i tipi di intersezione che possono darti qualcosa di simile a :: Int -> Int | Bool -> Bool, quindi sai che sono sufficienti due specializzazioni Inte Boolsono sufficienti, oppure usare una normale inferenza di tipo per inferire la maggior parte dei tipi generali seguita da un'analisi del flusso di controllo per raccogliere digita argomenti. In effetti ci sono approcci ibridi (CFA espresso come un sistema di tipo e viceversa).

La ricerca lavora sull'inferenza dei tipi meno generali invece che della maggior parte dei tipi generali, ma non ne sono consapevole.

Per quanto riguarda le tecniche per implementare il polimorfismo, esistono due soluzioni: 1) specializzazione (si pensi ai modelli C ++) 2) assunzione della rappresentazione uniforme (si pensi alle collezioni in stile C con vuoto *).

Per 2 non è necessario il tipo da call-site durante il controllo dei tipi e è possibile supportare la compilazione separata più facilmente.

Si noti che qui stiamo parlando di polimorfismo parametrico e le chiamate al metodo virtuale OO sono cose completamente diverse chiamate polimorfismo del sottotipo. Si noti che i modelli C ++ supportano sia qualcosa come il polimorfismo parametrico che la tipizzazione delle anatre, che è ancora un'altra forma di polimorfismo.


1
"Le chiamate di metodo virtuali OO sono una cosa completamente diversa chiamata polimorfismo ad hoc" Il polimorfismo ad hoc è un altro nome per sovraccarico. Sembra che lo confonda con il polimorfismo dei sottotipi.
Radu GRIGore,

Ma le sottoclassi non sono necessariamente sottotipi, vero? Ad esempio per i sottotipi che LSP dovrebbe contenere.
nponeccop,

1
Vero, ma a parte il punto. "Polimorfismo dei sottotipi" è il termine standard. Vedi en.wikipedia.org/wiki/Subtype_polymorphism per i dettagli.
Radu GRIGore,
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.