Rekurencja polimorficzna - Polymorphic recursion

W informatyce , polimorficzne rekursji (określany również jako Milner - Mycroft typability lub rachunek Milner-Mycroft ) dotyczy rekursywnego parametrycznie polimorficzne funkcji , w którym zmienia się z każdym parametrem typu rekurencyjnego wywołania wykonany, zamiast pozostawania stałej. Wnioskowanie o typie dla rekurencji polimorficznej jest równoważne półunifikacji i dlatego jest nierozstrzygalne i wymaga użycia półalgorytmu lub adnotacji typu dostarczonych przez programistę .

Przykład

Zagnieżdżone typy danych

Rozważ następujący zagnieżdżony typ danych :

data Nested a = a :<: (Nested [a]) | Epsilon
infixr 5 :<:

nested = 1 :<: [2,3,4] :<: [[5,6],[7],[8,9]] :<: Epsilon

Funkcja długości zdefiniowana na tym typie danych będzie polimorficznie rekurencyjna, ponieważ typ argumentu zmieni się z Nested ana Nested [a]na w wywołaniu rekurencyjnym:

length :: Nested a -> Int
length Epsilon    = 0
length (_ :<: xs) = 1 + length xs

Zauważ, że Haskell normalnie wywnioskuje sygnaturę typu dla funkcji tak prosto wyglądającej jak ta, ale tutaj nie można jej pominąć bez wywołania błędu typu.

Typy o wyższej randze

Aplikacje

Analiza programu

W analizie programowej opartej na typach rekurencja polimorficzna jest często niezbędna do uzyskania wysokiej precyzji analizy. Godne uwagi przykłady systemów wykorzystujących rekurencję polimorficzną obejmują analizę czasu wiązania Dussarta, Hengleina i Mossina oraz system zarządzania pamięcią oparty na regionie Tofte-Talpina . Ponieważ systemy te zakładają, że wyrażenia zostały już wpisane w bazowym systemie typów (niekoniecznie przy użyciu rekurencji polimorficznej), wnioskowanie może być ponownie rozstrzygane.

Struktury danych, wykrywanie błędów, rozwiązania grafowe

Struktury danych programowania funkcjonalnego często wykorzystują rekurencję polimorficzną, aby uprościć sprawdzanie błędów typów i rozwiązywać problemy za pomocą paskudnych „środkowych” rozwiązań tymczasowych, które pochłaniają pamięć w bardziej tradycyjnych strukturach danych, takich jak drzewa. W dwóch poniższych cytatach Okasaki (s. 144-146) podaje przykład CONS w Haskell, w którym system typów polimorficznych automatycznie oznacza błędy programisty. Aspektem rekurencyjnym jest to, że definicja typu zapewnia, że ​​najbardziej zewnętrzny konstruktor ma jeden element, drugi parę, trzeci parę par itd. rekurencyjnie, ustawiając wzorzec automatycznego wyszukiwania błędów w typie danych. Roberts (s. 171) podaje pokrewny przykład w Javie , używający klasy do reprezentowania ramki stosu. Podany przykład jest rozwiązaniem problemu Wieży Hanoi, w którym stos symuluje rekurencję polimorficzną z początkową, tymczasową i końcową zagnieżdżoną strukturą zastępowania stosu.

Zobacz też

Uwagi

Dalsza lektura

Linki zewnętrzne

Rekursja polimorficzna
Rekursja polimorficzna