2008-09-28 11 views
16

Wikipedia hat folgende zu sagen:Was ist "Total Functional Programming"?

Gesamt funktionale Programmierung (auch als starke funktionale Programmierung bekannt, mit gewöhnlicher oder schwacher funktioneller Programmierung gegenübergestellt wird) ist ein Programmierparadigma , die den Bereich beschränkt Programme zu denen, die beweisbar Terminierung sind.

und

Diese Einschränkungen bedeuten, dass insgesamt funktionale Programmierung nicht Turing-vollständig ist. Jedoch ist der Satz von Algorithmen, die verwendet werden können, immer noch riesig. Zum Beispiel kann jeder Algorithmus, der hat berechnet, eine asymptotische obere Schranke hatten dafür in eine transformierten trivially sein kann beweisbar abbrechenden Funktion durch die obere Grenze als ein zusätzliches Argument die bei jedem Iteration oder Rekursion dekrementiert wird.

Es gibt auch einen Lambda The Ultimate Post über ein Papier auf Total Functional Programming.

Ich war bis letzte Woche nicht auf einer Mailing-Liste.

Gibt es weitere Ressourcen, Referenzen oder Implementierungen, die Sie kennen?

+0

Ich denke, dass an dieser Stelle ist nur eine Idee ohne Umsetzung. Ich würde mich aber gerne irren. Entschuldigung, habe den Beitrag von LtU nicht überprüft, bevor ich die Antwort geschrieben habe, die ich gelöscht habe. –

+1

Hah, ich hätte nie über diese triviale Transformation nachgedacht. Das ist ziemlich toll. –

+2

@VinkoVrsalovic Dies ist derzeit in Coq implementiert (und war in '08, afaik). Nun, ob Coq benutzt wird oder nicht, ist eine andere Geschichte ;-) –

Antwort

23

Wenn ich das richtig verstanden habe, bedeutet Total Functional Programming genau das: Programmieren mit Total Functions. Wenn ich mich an meine Mathe-Kurse richtig erinnere, ist eine Total Function eine Funktion, die über ihre gesamte Domäne definiert ist, eine Partial Function ist eine Funktion, die in ihrer Definition "Löcher" aufweist.

Nun, wenn Sie eine Funktion haben, die für einige Eingabewerte v in eine unendliche Rekursion oder eine Endlosschleife geht oder im Allgemeinen nicht auf eine andere Weise endet, dann ist Ihre Funktion nicht für v definiert und somit auch nicht teilweise, dh nicht total.

Total Functional Programming erlaubt Ihnen nicht, eine solche Funktion zu schreiben. Alle Funktionen geben immer ein Ergebnis für alle möglichen Eingaben zurück; und der Type Checker stellt sicher, dass dies der Fall ist.

Meine Vermutung ist, dass dies die Fehlerbehandlung erheblich vereinfacht: Es gibt keine.

Der Nachteil ist bereits in Ihrem Zitat erwähnt: Es ist nicht Turing-vollständig. Z.B. Ein Betriebssystem ist im Wesentlichen eine riesige Endlosschleife. In der Tat, wir nicht wollen ein Betriebssystem zu beenden, nennen wir dieses Verhalten einen "Absturz" und schreien an unseren Computern darüber!

+0

das große Ding, das dies nicht erlaubt, ist unbegrenzte Minimalisierung. Ich weiß manchmal, dass diese Stile auch Programme erlauben, die nachweisbar nie enden, da diese auch nützlich sein können (z. B. Betriebssysteme). Die schwer zu handhabenden Funktionen sind diejenigen, die möglicherweise beendet werden, weil Sie nicht wissen können, ob Ihr Programm Ihnen die Antwort (oder halt) geben wird. – Snark

+4

Ich stimme nicht zu, wenn Sie das Papier lesen und posten, können Sie eine Gesamtfunktion haben, die "für immer läuft", es ist einfach eine koinduktiv definierte Funktion, keine induktiv definierte Funktion, das ist genau _wie_ Sie würden ein Betriebssystem mit diesem schreiben Methode der Programmierung. –

+1

@KristopherMicinski bedeutet induktiv rekursiv? Koinduktiv bedeutet also kursiv? Bedeutet das, dass eine vollständige funktionale Programmierung weiterhin eine Nichtbeendigung erlaubt, indem zwischen Daten und Codata unterschieden wird? – CMCDragonkai

9

Während dies eine alte Frage ist, glaube ich, dass keine der Antworten weit so die reale Motivation für die gesamte funktionale Programmierung, erwähnen, die dies :

Wenn Programme Proofs und Proofs Programme sind, dann haben Programme, die "Löcher" haben, keinen Sinn als Beweise und führen zu logischer Inkonsistenz.

Grundsätzlich, wenn ein Beweis ein Programm ist, kann eine Endlosschleife verwendet werden, um alles zu beweisen. Das ist wirklich schlecht und liefert einen Großteil der Motivation dafür, warum wir total programmieren wollen. Andere Antworten neigen dazu, die Kehrseite des Papiers nicht zu berücksichtigen. Während die Sprachen technisch nicht vollständig sind, können Sie viele interessante Programme wiederherstellen, indem Sie co-induktive Definitionen und Funktionen verwenden. Wir sind sehr anfällig für induktive Daten, aber codata dient ein wichtiger Zweck in diesen Sprachen, wo Sie eine Definition, die unendlich ist vollständig definieren können (und wenn Sie echte Berechnung, die beendet, verwenden Sie möglicherweise nur eine Endliches Stück davon, oder vielleicht nicht, wenn Sie ein Betriebssystem schreiben!).

Es ist auch erwähnenswert, dass die meisten Proofassistenten basierend auf diesem Prinzip arbeiten, zum Beispiel Coq.

+0

Es ist wahr, dass eine Inkonsistenz Ihre logischen System-AIDs gibt, aber für Programmierer (und der Titel dieses Threads ist "Programmierung"), ist es nicht das Ende der Welt. Es bedeutet nur, dass Sie viel vorsichtiger sein müssen, wenn Sie über Ihr System nachdenken. Wenn Sie nicht terminierende Terme haben können, dann können Sie (unbedingt) n - n nicht durch 0 ersetzen. (Es löscht einen Terminierungseffekt, der koscher sein kann oder auch nicht).Programmierer neigen jedoch nicht dazu, sich um Eckfälle zu kümmern, wenn sie abgeschrieben werden können. Vielleicht ist der Fall äußerst selten oder unwahrscheinlich und die Anwendung ausreichend nicht geschäftskritisch. –

+0

@ Tac-Tics du hast Recht, ich hätte klarstellen sollen, dass "logische Inkonsistenz" nicht direkt auf "Programmschlechtigkeit" in einem realistischen Sinn abbildet. Das ist der Grund, warum die meisten Leute zum Beispiel keinen Code in Coq schreiben: weil die Kantenfälle, die in funktionalen Spezifikationen auftauchen, oft nicht wichtig genug sind, um die zusätzliche Zeit zu rechtfertigen, die ausgegeben wird, um alle Eigenschaften Ihrer Programme zu beweisen! –

Verwandte Themen