Ich habe eine ähnliche Frage zu cstheory.SE gestellt .
Laut dieser Antwort auf Stackoverflow gibt es einen Algorithmus, der auf einer nicht faulen reinen funktionalen Programmiersprache eine -Komplexität aufweist, während derselbe Algorithmus in der imperativen Programmierung . Das Hinzufügen von Faulheit zur FP-Sprache würde den Algorithmus zu .
Gibt es eine äquivalente Beziehung zum Vergleich einer FP-Sprache mit und ohne Funktionen höherer Ordnung? Ist es noch Turing Complete? Wenn ja, macht der Mangel an höherer Ordnung bei FP die Sprache weniger "mächtig" oder effizient?
Antworten:
In einer funktionalen Programmiersprache, die leistungsfähig genug ist (beispielsweise mit Datentypen zum Implementieren von Closures ), können Sie alle Verwendungen höherer Ordnung durch die Transformation der Defunktionalisierung eliminieren . Da diese Methode zum Kompilieren dieser Art von Sprache verwendet wird, können Sie davon ausgehen, dass dies keine Auswirkungen auf die Leistung hat und dass in dieser Einstellung eine höhere Reihenfolge die Sprache nicht weniger leistungsfähig macht. Es wirkt sich jedoch darauf aus, wie Code geschrieben wird.
Wenn die Sprache jedoch nicht mächtig genug ist, liefert eine höhere Ordnung die Ausdruckskraft. Betrachten Sie die Lambda-Rechnung: Ohne eine Funktion höherer Ordnung kann sie wirklich nichts ausrichten, hauptsächlich, weil die grundlegendsten Datentypen (Ganzzahlen, Boolesche Werte) mithilfe von Funktionen implementiert werden.
Abschließend kommt es wirklich auf die Sprache an.
Oben ist meine Antwort. Nachfolgend ein Kommentar zu einer üblichen Annahme über imperative Sprachen.
Ich möchte diesen Hinweis sehen. Die übliche Annahme ist, dass ein Zugriff auf ein Array der Länge in einem RAM zur Zeit O ( 1 ) und das Äquivalent in reinem FP zur Zeit O ( log n ) ist . Das ist nicht ganz richtig: Die Zugriffszeit in einem RAM ist in O ( log m ), wobei m die Größe des Speichers ist. Natürlich ist m ≥ n . In der Praxis ist der Zugriff auf ein Element eines Arrays viel schneller. Ein Grund wäre, dass m begrenzt ist, aber ... n auch !n O ( 1 ) O ( logn ) O ( logm ) m m ≥ n m n
EDIT: Danke für den Link (der Link für das Paper über Faulheit ist nicht verfügbar, hier ist noch einer ). Wie in den Kommentaren und oben in meiner Antwort angegeben, ist das RAM-Modell etwas unfair gegenüber reinem FP, da es -Zeit-Lookups bietet, auch wenn die Größe einer Adresse nicht beschränkt ist. Ich muss noch verstehen, wie der faule Trick funktioniert, aber ich denke, es ist wichtig zu beachten, dass dies nur für dieses spezielle Problem gilt.O ( 1 )
quelle
Es kommt darauf an, was Sie unter Ausdruckskraft verstehen.
Hier ist ein Argument, dass höhere Ordnung etwas hinzufügt: Bei Sprachen erster Ordnung reicht die primitive Rekursion nicht aus, um die Ackermann-Funktion auszudrücken . In Gegenwart von Funktionen höherer Ordnung ist jedoch eine primitive Rekursion ausreichend:
Dies definiert die Ackermann-Funktion nur mit primitiver Rekursion.
Beachten Sie, dass in der konventionellen Rekursionstheorie nicht definierbar ist, da Iter eine höhere Ordnung hat. In der konventionellen Rekursionstheorie haben alle definierbaren Funktionen für einige k den Typ N k → N , während Iter den Typ ( N → N ) → ( N → N ) hat .Iter Iter Nk→N k Iter ( N → N ) → ( N → N)
quelle