2012-10-24 9 views
12

Jakiego rodzaju wnioskowania typu robi Typed Racket? Znalazłem następujący fragment na liście Rakieta do korespondencji:Jak działa typingowa kombinacja typów rakietowych?

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.

krótką informację powyżej stosuje się termin „miejscowy typ wnioskowania”, a ja również słyszałem „występowanie wpisując” używany dużo, ale nie wiem dokładnie jasne, co oznaczają te terminy.

Wydaje mi się, że system wnioskowania typu, który jest obecnie używany, jest niepotrzebnie słaby. Oto przykład tego, co mam na myśli. Następujące nie typ kontroli:

(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))) 

Trzeba wyraźnie opisywanie midpoint z (: midpoint (pt pt -> pt)), w przeciwnym razie pojawia się błąd: Type Checker: Expected pt, but got Any in: p1. Dlaczego weryfikator nie może z tego wywnioskować, że typy p1 i p2 muszą być pt? Czy jest to podstawowe ograniczenie sposobu, w jaki Racket implementuje typy (tj. Czy ta linia rozumowania jest czasami błędna, z powodu niektórych bardziej zaawansowanych funkcji Racket'a), czy jest to coś, co mogłoby zostać wdrożone w przyszłości?

+6

Sam Tobin-Höchstadt Doktorat Rozprawa powinna mieć drastyczne szczegóły: http://www.ccs.neu.edu/racket/pubs/dissertation-tobin-hochstadt.pdf – dyoo

Odpowiedz

6

Domyślnie zakłada się, że niezapisane funkcje najwyższego poziomu mają typy wejściowe i wyjściowe: Any. Oferuję to niejasne wyjaśnienie: ponieważ system typu Racket jest elastyczny, może czasami wnioskować o typach, których się nie spodziewałeś, i pozwolić niektórym programom na sprawdzenie, czy wolisz emitować błąd typu.

Tangent: możesz również użyć formularza define:, jeśli to ci odpowiada.

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

dodanie do tej odpowiedzi: będę weź "dobrze zdefiniowane" ponad "sprytne" w każdy dzień tygodnia. Problem z "sprytnym" jest taki, że jako programista, prędzej czy później zejdziesz gdzieś po drugiej stronie granicy pomiędzy możliwą do sprawdzenia i nie do sprawdzenia, a ty musisz wymyślić jak zmienić swój kod tak sprawdzający może to potwierdzić. W takiej sytuacji próba intuicji, do której sprytności można się odwołać, może być bardzo trudna. –

+1

Wygląda na to, że tak naprawdę nie jest to podstawowe * ograniczenie * - zamiast tego jest tylko ten rozmyta szara strefa pomiędzy programami, które są dobrze napisane, a programami, które nie są (i może ten obszar jest większy w Typed Racket niż w innych typach systemy, ponieważ system rakiet jest tak elastyczny). Ludzie, którzy zaprojektowali wnioskowanie z Renderowania Typu, po prostu trzymali się jak najdalej od tej granicy: jest tylko kilka, dobrze określonych przypadków, w których może dojść do wnioskowania o typie, a wszystko inne musi być jawnie zadeklarowane. W ten sposób unikają wpadania w splątany bałagan. Czy to w porządku? – Ord

+0

@Ord that's about right. Możesz przeczytać rozprawę Sama o szczegółach. Nawet część tego poświęca temu zagadnieniu: sekcja 3.2. –

Powiązane problemy