Pytanie W jaki sposób działa inferencja typów Typed Racket?


Jakiego typu wnioskowania dokonuje Typed Racket? Znalazłem następujący fragment na liście mailingowej Racket:

System typu Typed Racket zawiera wiele funkcji, które działają   poza tym, co jest obsługiwane w systemach typu Hindley / Milner i tak dalej   nie możemy użyć tego systemu wnioskowania. Obecnie używa Typed Racket   lokalne wnioskowanie typu, aby wywnioskować wiele typów w twoim programie, ale   chcielibyśmy wywnioskować więcej z nich - jest to bieżący obszar   Badania.

Powyższy blurb używa terminu "wnioskowanie lokalne" i słyszałem też, że "typowanie zdarzeń" było używane bardzo często, ale nie jestem do końca pewien, co oznaczają te terminy.

Wydaje mi się, że system wnioskowania typu, który obecnie używa Rakietowania, jest niepotrzebnie słaby. Oto przykład tego, co mam na myśli. Poniższe nie sprawdza typu:

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

Musisz wyraźnie opisać midpoint z (: midpoint (pt pt -> pt)), w przeciwnym razie pojawi się błąd: Type Checker: Expected pt, but got Any in: p1. Dlaczego checker nie może po prostu wyciągnąć z tego wniosku, że typy p1 i p2  musi być pt? Czy jest to podstawowe ograniczenie sposobu, w jaki Racket implementuje typy (to jest jest to linia rozumowania w rzeczywistości źle czasami, z powodu niektórych bardziej zaawansowanych funkcji Racket'a, czy jest to coś, co mogłoby zostać wdrożone w przyszłości?


12
2017-10-24 17:53


pochodzenie


Rozprawa doktorska Sam Tobin-Hochstadt powinna zawierać szczegółowe informacje: ccs.neu.edu/racket/pubs/dissertation-tobin-hochstadt.pdf - dyoo


Odpowiedzi:


Domyślnie zakłada się, że niezapisane funkcje najwyższego poziomu mają typy wejściowe i wyjściowe Any. Oferuję to niejasne wyjaśnienie: od systemu typu rakietowego więc elastyczny, może czasem 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ć define: jeśli to ci odpowiada.

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

6
2017-10-24 20:07



Dodając do tego odpowiedź: Wezmę "dobrze zdefiniowany" ponad "sprytny" dowolny 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. - John Clements
Wygląda więc na to, że tak naprawdę nie ma podstaw ograniczenie - zamiast tego jest tylko ten rozmyta szara strefa pomiędzy programami, które są dobrze napisane i programami, które nie są (i być może ten obszar jest większy w Typed Racket niż w innych systemach typu, 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
@Ord, to jest w porządku. Możesz przeczytać rozprawę Sama o szczegółach. Nawet część tego poświęca temu zagadnieniu: sekcja 3.2. - Dan Burton