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?
tesi di dottorato di Sam Tobin-Hochstadt dovrebbe avere i dettagli scabrosi: http://www.ccs.neu.edu/racket/pubs/dissertation-tobin-hochstadt.pdf – dyoo