Polymorf rekursion

Inom datavetenskap hänvisar polymorf rekursion (även kallad Milner Mycroft typability eller Milner – Mycroft calculus ) till en rekursiv parametriskt polymorf funktion där typparametern ändras med varje rekursiv anrop som görs, istället för att förbli konstant . Typinferens för polymorf rekursion är ekvivalent med semi-unifiering och är därför obestämbar och kräver användning av en semi-algoritm eller annoteringar av programmerare .

Exempel

Kapslade datatyper

Tänk på följande kapslade datatyp:

         
  

         data  Kapslad  a  =  a  :<:  (  Kapslad  [  a  ])  |  Epsilon  infixr  5  :<:  kapslade  =  1  :<:  [  2  ,  3  ,  4  ]  :<:  [[  5  ,  6  ],[  7  ],[  8  ,  9  ]]  :<:  Epsilon 

En längdfunktion definierad över denna datatyp kommer att vara polymorfiskt rekursiv, eftersom typen av argument ändras från Nested a till Nested [a] i det rekursiva anropet:

     
      0
         längd  ::  Kapslad  a  ->  Int  längd  Epsilon  =  längd  (  _  :<:  xs  )  =  1  +  längd  xs 

Observera att Haskell normalt härleder typsignaturen för en funktion som är så enkel som denna, men här kan den inte utelämnas utan att ett typfel utlöses.

Högre rankade typer

Ansökningar

Programanalys

I typbaserad programanalys är polymorf rekursion ofta väsentlig för att få hög precision i analysen. Anmärkningsvärda exempel på system som använder polymorf rekursion inkluderar Dussart, Henglein och Mossins bindningstidsanalys och det Tofte–Talpin- regionbaserade minneshanteringssystemet . Eftersom dessa system antar att uttrycken redan har skrivits in i ett underliggande typsystem (inte nödvändigt med användning av polymorf rekursion), kan slutsatser göras avgörbara igen.

Datastrukturer, felsökning, graflösningar

Funktionella programmeringsdatastrukturer använder ofta polymorf rekursion för att förenkla typfelkontroller och lösa problem med otäcka "mitten" temporära lösningar som slukar minne i mer traditionella datastrukturer som träd. I de två citaten som följer ger Okasaki (sid. 144–146) ett CONS-exempel i Haskell där det polymorfa typen automatiskt flaggar programmeringsfel. Den rekursiva aspekten är att typdefinitionen säkerställer att den yttersta konstruktorn har ett enda element, den andra ett par, den tredje ett par par etc. rekursivt, vilket sätter ett automatiskt felsökningsmönster i datatypen. Roberts (sid. 171) ger ett relaterat exempel i Java där en klass används för att representera en stackram. Exemplet som ges är en lösning på Tower of Hanoi- problemet där en stack simulerar polymorf rekursion med en början, temporär och avslutande kapslad stacksubstitutionsstruktur.

Se även

Anteckningar

Vidare läsning

externa länkar

Polymorf rekursion
Polymorf rekursion