Y-Kombinator in D?

8

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?

    
Mehrdad 04.08.2011, 07:44
quelle

4 Antworten

7

Siehe eine ausführliche Erklärung hier .

    
Eli Barzilay 04.08.2011, 09:09
quelle
4

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.

    
BCS 04.08.2011 15:53
quelle
3

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 .

    
LiKao 04.08.2011 08:13
quelle
3

Mein generischer Y-Kombinator in D:

%Vor%

Ich begann mit einer trivialen rekursiven Definition der faktoriellen Funktion und modifizierte sie, bis mein Code so aussah. Das Problem mit dem unendlichen Typ wird mit einem Typwrapper (Struktur F) umgangen.

    
tgehr 04.08.2011 19:30
quelle