Ich versuche, den Y-Kombinator besser zu lernen (ich sortiere verstehe es in Schema) und implementiere ihn in D 2.0, und ich versage ziemlich kläglich:
%Vor% Das funktioniert nicht, aus dem offensichtlichen Grund, dass ich fact
nicht an fact
weitergeben kann (was wäre sein Typ?). Und außerdem brauche ich noch fact
's Namen, um sich selbst zu übergeben, also würde es sowieso nicht funktionieren, oder?
Aber ... wie gehe ich bei der Implementierung des Y-Kombinators in D vor?
Es ist eine bekannte Einschränkung von D (und C / C ++), dass Funktionen, die sich mit typisierten Selbstreferenzen befassen, unmöglich sind (das letzte Mal, wenn ich das überprüft habe).
Ich finde das ironisch, weil es zu einer Beschränkung der Syntax (die Länge des Funktionsprototyps ist unendlich) oder Namenskonvention (das gleiche Problem, aber mit Namen Mangling) statt irgendetwas semantischen oder architektonischen.
Ich kenne D nicht, aber bei den meisten Sprachen werden Sie Probleme mit dem Typ der Funktion bekommen, wenn Sie versuchen, Nicht-Rekursion zu implementieren (es gibt noch keinen Y-Combinator in Ihrem Code). Der übliche Weg kann erreicht werden, indem man die Typen in mehrere Teile teilt und auf diese Weise die Rekursion in den Typ bringt.
Ein Beispiel aus anderen Sprachen:
In C schreibt man normalerweise eine Struktur, die den Funktionszeiger enthält. Diese Struktur kann dann als Argument verwendet werden.
In OCaml würde man einen Variantentyp hinzufügen, der den Funktionstyp umschließt. Auch dies ermöglicht die Trennung der Typen, so dass eine Rekursion möglich ist.
Wenn Sie ein Beispiel aus anderen Sprachen wünschen, schauen Sie sich diese Seite an .
Tags und Links functional-programming lambda-calculus d y-combinator d2