Gute Erklärung von "Combinators" (Für nicht-Mathematiker)
Hat jemand eine gute Erklärung von "combinators" (Y-combinators etc. und NICHT das Unternehmen)?
Ich bin auf der Suche nach einem für das praktische-Programmierer, die Rekursion versteht und höherer Ordnung Funktionen, die aber nicht über eine starke Theorie oder mathematischen hintergrund.
(Hinweis: ich spreche diese Dinge)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sei denn, Sie sind tief in der Theorie, können Sie die Y combinator
als ein netter trick, mit Funktionen, wie Monaden.
Monaden erlauben, Sie an die Kette von Aktionen, die Y-combinator können Sie
Definition von selbst-rekursiven Funktionen.
Python hat eine eingebaute Unterstützung für selbst-rekursive Funktionen, so dass Sie
können Sie definieren, ohne Y:
fun
ist innen zugänglichfun
selbst, so können wir leicht nennen.Aber was ist, wenn Python waren anders, und
fun
waren nicht zugänglichinnerhalb
fun
?Die Lösung ist ein pass
fun
sich als argument, umfun
:- Und Y macht das möglich:
Alle es tut, aufrufen einer Funktion mit sich selbst als argument.
(Ich weiß nicht, ob diese definition von Y ist 100% richtig, aber ich denke, es ist die Allgemeine Idee).
Reginald Braithwaite (aka Raganwald) hat er eine tolle Serie auf combinators in Ruby hinüber zu seinem neuen blog, homoiconic.
Während er nicht (meines Wissens) Blick auf die Y-combinator selbst, er hat den Blick auf andere combinators, zum Beispiel:
und ein paar Beiträge auf, wie Sie kann verwenden Sie.
Zitat Wikipedia:
Nun, was hat das zu bedeuten??? Es bedeutet einen combinator ist eine Funktion (Ausgang ist bestimmt allein durch seinen input), deren Eingang enthält eine Funktion als argument.
Welche Bedeutung haben solche Funktionen Aussehen, und was werden Sie verwendet? Hier sind einige Beispiele:
(f o g)(x) = f(g(x))
Hier
o
ist ein combinator, die 2 Funktionenf
undg
aus und liefert eine Funktion als Ergebnis wird die Zusammensetzung derf
mitg
nämlichf o g
.Combinators können ausgeblendet werden, um die Logik. Sagen wir, wir haben einen Datentyp
NumberUndefined
, woNumberUndefined
nehmen können, auf einen numerischen WertNum x
oder einen WertUndefined
, wox
a ist einNumber
. Nun wollen wir bauen addition, Subtraktion, Multiplikation und division für diese neu numerischen Typ. Die Semantik ist die gleiche wie für diejenigen derNumber
außer wennUndefined
ist ein input, der output muss auchUndefined
und bei der Division durch die Anzahl0
ist die Ausgabe auchUndefined
.Könnte man schreiben die mühsame code wie folgt:
Beachten Sie, wie die alle die gleiche Logik über
Undefined
input-Werte. Nur division spielt ein bisschen mehr. Die Lösung ist ein Extrakt aus der Logik, indem es einen combinator.Dies kann verallgemeinert werden und in den so genannten
Maybe
Monade, die Programmierer nutzen in funktionalen Sprachen wie Haskell, aber ich werde nicht dorthin gehen.Einen combinator ist die Funktion mit keine freien Variablen. Das bedeutet unter anderem, dass der combinator keine Abhängigkeiten haben, die auf Dinge außerhalb der Funktion, nur auf die Parameter der Funktion.
Mit F# dies ist mein Verständnis des combinators:
In die oben genannte Summe ist ein combinator, da beide
a
undb
sind gebunden an die Funktion Parameter.Die obige Funktion ist nicht combinator, wie es verwendet
sum
, die nicht eine gebundene variable (d.h., es kommt nicht aus einer der Parameter).Können wir machen sum3 ein combinator, indem Sie einfach übergeben Sie die Summe-Funktion als Parameter:
Diese Weise
sumFunc
ist gebunden und damit die gesamte Funktion ist ein combinator.So, dies ist mein Verständnis des combinators. Ihre Bedeutung, auf der anderen Seite, noch entgeht mir. Wie andere darauf hingewiesen, fixed-point-combinators ermöglichen die express eine rekursive Funktion ohne
explicit
Rekursion. I. e. anstatt das sich die recusrsive Funktionsaufrufe lambda-Ausdruck, der übergeben wird als eines der Argumente.Hier ist eine der am meisten verständlich combinator, die Ableitungen, die ich gefunden habe:
http://mvanier.livejournal.com/2897.html
+
in der definition vonsum
? Es ist nicht gebunden.Diese sieht eine gute : http://www.catonmat.net/blog/derivation-of-ycombinator/
Ich bin ziemlich kurz, auf der Theorie, aber ich kann Ihnen ein Beispiel geben, dass setzt meine Phantasie aflutter, die hilfreich sein können. Die einfachste interessant combinator ist wohl "testen".
Hoffe du weißt Python
Verwendung:
test wertet das zweite argument, wenn das erste argument wahr ist, sonst das Dritte.
Ganze Systeme aufgebaut werden kann, von ein paar grundlegende combinators.
(Dieses Beispiel ist mehr oder weniger kopiert von Typen und Programmiersprachen von Benjamin C. Pierce)
Dies ist eine gute Artikel.
Die code-Beispiele sind in Schema, aber Sie sollte nicht schwer zu Folgen.
Kurz -, Y-combinator ist ein höherer Ordnung-Funktion, die verwendet wird, zu implementieren Rekursion auf lambda-Ausdrücke (anonyme Funktionen). Überprüfen Sie die Artikel Wie Erfolgreich die Rekursion Ohne Wirklich Recursing von Mike Vanier - es ist eines der besten praktischen Erläuterung dieser Frage, die ich gesehen habe.
Auch, Scannen Sie den SO-Archive: