W poszukiwaniu artykułów naukowych na temat systemów typów dla języków imperatywnych znajduję rozwiązania tylko dla języka ze zmiennymi odnośnikami, ale bez prawdziwych struktur kontroli imperatywnej, takich jak operatory złożone, pętle lub warunki warunkowe.
Nie jest więc jasne, w jaki sposób można wdrożyć imperatywny język z częściowym wnioskiem o typie, taki jak http://rust-lang.org .
W artykułach nie wspomniano o typach sparametryzowanych, List of a
ponieważ typy sparametryzowane są trywialnym rozszerzeniem systemu typów Hindleya-Milnera - należy rozszerzyć tylko algorytm unifikacji, a reszta wnioskowania działa bez zmian. Jednak zadań nie można dodawać w trywialny sposób, ponieważ powstają paradoksy, dlatego należy zastosować specjalne techniki, takie jak ograniczenie wartości ML.
Czy możesz polecić jakieś artykuły lub książki opisujące system pisma dla języka z imperatywnymi pętlami, warunkami warunkowymi, IO i instrukcjami złożonymi?
źródło
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end
. Więc na poziomie pytania badawczego, czy szukasz odpowiedzi „zastosuj techniki opracowane w Caml / SML, w tym ograniczenie wartości”?Odpowiedzi:
Jeśli szukasz zgrabnego, funkcjonalnego odniesienia do wnioskowania o typie, jestem trochę stronnikiem Gundry, McBride i McKinny z „ Inferencji typów w kontekście ”, choć może to nie być dobrym przewodnikiem po istniejących istniejących implementacjach .
Myślę, że częścią odpowiedzi jest to, że poza ograniczeniem wartości naprawdę nie ma tak dużych trudności w dostosowaniu wnioskowania typu Hindley-Milner do języków imperatywnych: jeśli zdefiniujesz
e1; e2
jako cukier składniowy(fn _ => e2) e1
i zdefiniujeszwhile e1 do e2
jako cukier syntaktyczny dlawhiledo e1 (fn () => e2)
, gdziewhiledo
jest regularny funkcja rekurencyjnawtedy wszystko będzie działać poprawnie, w tym wnioskowanie typu.
Jeśli chodzi o ograniczenie wartości będące specjalną techniką, podoba mi się następująca historia; Jestem prawie pewien, że odebrałem go od Karla Crary'ego. Rozważ następujący kod, którego ograniczenie wartości nie pozwoli Ci pisać w ML:
Porównaj go z następującym kodem, który jest całkowicie bezproblemowy:
Wiemy, co robi drugi przykład: tworzy dwie nowe komórki ref zawierające
NONE
, następnie wstawiaSOME 5
pierwszą (anint option ref
), a następnie wstawiaSOME "Hello"
drugą (astring option ref
).x
x
x
Sugerowałoby to, że jednym „dobrym” zachowaniem w pierwszym przykładzie jest zachowanie dokładnie tak samo, jak w drugim przykładzie - utworzenie wystąpienia lambda na poziomie typu dwa razy. Za pierwszym razem instancję
x
zint
, który spowoduje, żex [int]
do oceny do gospodarstwa komórek odniesieniaNONE
, a następnieSOME 5
. Po raz drugi wystąpieniax
zstring
, które będą rozróżnianex [string]
ocenić na ( inaczej! Gospodarstwie) komórek odniesieniaNONE
, a następnieSOME "Hello"
. To zachowanie jest „poprawne” (bezpieczne dla typu), ale zdecydowanie nie jest to, czego programista by się spodziewał, i dlatego mamy ograniczenie wartości w ML, aby uniknąć programistów radzących sobie z tym nieoczekiwanym zachowaniem.źródło
e1; e2
zawiera niedopasowany nawias i średnik (który ma zdefiniować). Miałeś na myśli(fn _ => e2) e1
?Rozprawa doktorska Xaviera Leroya to dobry początek.
źródło
Przepraszam, że muszę odpowiedzieć na własne pytanie, ale jest to odniesienie
Propozycja dotycząca standardowego ML , Milner, 1983
Część 6 „Standardowe formy pochodne” obejmuje dość obszerne rozwiązywanie konstrukcji imperatywnych. I jak dotąd jest to najwcześniejsza wzmianka o tych w dużej mierze oczywistych przemianach, jakie udało mi się znaleźć.
źródło