2012-10-24 10 views
12

Che tipo di inferenza di tipo fa Rack tipizzato? Ho trovato il seguente frammento sulla racchetta mailing list:Come funziona l'inferenza di tipo di Typed Racket?

The Typed Racket type system contains a number of features that go beyond what's supported in Hindley/Milner style type systems, and so we can't use that inference system. Currently, Typed Racket uses local type inference to infer many of the types in your program, but we'd like to infer more of them -- this is an ongoing area of research.

La fascetta sopra usa il termine "tipo locale l'inferenza", e ho anche sentito "evento digitando" usato molto, ma io non sono esattamente sicuro di cosa significano questi termini.

Mi sembra che il sistema di inferenza di tipo attualmente utilizzato da Racket tipografico sia inutilmente debole. Ecco un esempio di cosa intendo. Quanto segue non digitare controllare:

(struct: pt ([x : Real] [y : Real])) 

(define (midpoint p1 p2) 
    (pt (/ (+ (pt-x p1) (pt-x p2)) 2) 
     (/ (+ (pt-y p1) (pt-y p2)) 2))) 

Bisogna annotare in modo esplicito midpoint con (: midpoint (pt pt -> pt)), altrimenti si ottiene l'errore: Type Checker: Expected pt, but got Any in: p1. Perché il controllore del tipo non riesce a concludere che i tipi di p1 e devono essere pt? Si tratta di una limitazione fondamentale del modo in cui Racket implementa i tipi (vale a dire che questa linea di ragionamento in realtà è errata a volte, a causa di alcune delle funzionalità di tipo più avanzate di Racket) o è qualcosa che potrebbe essere implementato in futuro?

+6

tesi di dottorato di Sam Tobin-Hochstadt dovrebbe avere i dettagli scabrosi: http://www.ccs.neu.edu/racket/pubs/dissertation-tobin-hochstadt.pdf – dyoo

risposta

6

Per impostazione predefinita, si presume che le funzioni di livello superiore non annotate dispongano di tipi di input e output di Any. Offro questa vaga spiegazione: dal momento che il sistema di tipo Racket è così flessibile, a volte può inferire tipi che non ci si aspetterebbe e consentire ad alcuni programmi di tipografare quando si preferisce che emettano un errore di tipo.

Tangente: è inoltre possibile utilizzare il modulo define: se questo è ciò che fa per voi.

(define: (midpoint [p1 : pt] [p2 : pt]) : pt 
    ...) 
+1

Aggiunta a questa risposta: Ti prendere "ben definito" oltre "intelligente" in qualsiasi giorno della settimana. Il problema con "intelligente" è che, come programmatore, prima o poi finirai da qualche parte proprio dall'altra parte del confine tra controllabile e non controllabile, e devi capire come cambiare il tuo codice in modo che il controllore può convalidarlo. In una situazione come questa, provare ad intuire a quale astuzia fare appello può essere molto difficile. –

+1

Quindi sembra che non ci sia davvero una limitazione * fondamentale * - invece, c'è solo questa area grigia sfumata tra programmi che sono ben tipizzati e programmi che non lo sono (e forse quest'area è più grande in Racked Typed di altri tipi sistemi, dal momento che il sistema Racket è così flessibile). Le persone che hanno progettato l'inferenza di Typed Racket sono semplicemente rimaste il più lontano possibile da quel limite: ci sono solo pochi casi ben definiti in cui può verificarsi un'inferenza di tipo, e tutto il resto deve essere esplicitamente dichiarato. In questo modo, evitano di entrare in un caos aggrovigliato. E 'giusto? – Ord

+0

@Ord è giusto. Puoi leggere la tesi di Sam per i dettagli. Ne dedica persino una sezione a questa domanda: sezione 3.2. –