Kann mich jemand auf die Referenz für die Nichtdefinierbarkeit des in PCF funktionalen Kontinuitätsmoduls hinweisen? \ newcommand {\ bool} {\ mathsf {bool}}
Andrej Bauer hat einen sehr schönen Blog-Beitrag geschrieben , in dem einige der Themen ausführlicher behandelt werden. Ich werde jedoch nur einen kleinen Teil seines Beitrags zusammenfassen, um dieser Frage einen Kontext zu verleihen. Der Baireschen Raum ist die Menge der natürlichen Zahlenfolgen, oder in äquivalenter Weise die Menge der Funktionen von naturals zu naturals . Bei dieser Frage beschränken wir uns nur auf die berechenbaren Streams.
Nun ist eine Funktion stetig, wenn für jedes der Wert von nur von einer endlichen Anzahl der Elemente von xs abhängt , und es ist rechnerisch stetig, wenn wir tatsächlich ein Oberes berechnen können gebunden, wie viele Elemente von benötigt werden. In einigen Berechnungsmodellen ist es tatsächlich möglich, ein Programm \ mathsf {modulus} zu schreiben : (B \ to \ bool) \ to B \ to \ N, das eine berechenbare Funktion für den Baire-Raum und ein Element des Baire-Raums übernimmt. und gibt die Obergrenze für die Anzahl der Elemente des Streams zurück.
Ein Trick, um dies zu implementieren, besteht darin, lokalen Speicher zu verwenden, um den maximalen Index im angezeigten Stream aufzuzeichnen:
let modulus f xs =
let r = ref 0 in
let ys = fun i -> (r := max i !r; xs i) in
f ys;
!r
Natürlich ist das ys
Argument kein rein funktionales Programm mehr. Mein Interesse an diesem Programm kommt von der Tatsache, dass es nur lokale Geschäfte nutzt und daher weitgehend rein ist. Ich arbeite (unter anderem) an imperativer Programmierung höherer Ordnung und entwerfe Typentheorien, die dies als reine Funktion klassifizieren könnten.
Es gibt auch praktischere Beispiele, die Dinge wie Memoisierung und Verbindungspooling beinhalten, aber ich finde dies ein besonders schönes Beispiel.