Frage

kann ich verstehen, wie über den SKI und BCKW Kalkül schaffen und zu denken, aber ich bin nie praktische Anwendungen finden kann. Vielleicht suchen Ich bin nicht tief genug? Das heißt, ich frage mich, ob (ein Beispiel nur bitte, ich bin damit nicht sagen, das ist wahr) Java Servlets Verwendung S ausgiebig und Python-Generatoren sind ein Beispiel für BCW und ich bin gerade nicht in der Lage durch den Wald von Bäumen zu sehen?

War es hilfreich?

Lösung

In Haskell, sie sind überall !

  • B <$>
  • C flip
  • K pure
  • I id
  • S <*>
  • W join

Aus Haskell Sicht <$> bedeutet "tun in einem Kontext".

  • (+2) <$> (*3) Mittel fügen Sie zwei , nachdem sie von drei multipliziert .
  • (+2) <$> [1,2,3] Mittel zwei bis jedes Element in der Liste .
  • (+2) <$> (read . getLine) Mittel zwei bis die Nummer Ich habe gerade gelesen .
  • (+2) <$> someParser Mittel zwei bis die Nummer, die ich gerade geparsten .

Dinge, die einen Kontext haben werden als functors . Alle Ihre Java / Python / C ++ Iteratoren sind einfach seltsam inside-out-Versionen von functors.

Eine weitere Verbindung: die S und K combinator zusammen sind Turing-vollständig. In Haskell, pure und <*> zusammen eine applicative Funktors bilden.

Natürlich, zu verstehen, wie die anderen Kombinatoren in passen Lernen Haskell erfordern. Aber dieses Beispiel zeigt, wie combinators sind so in der Sprache verankert.

Andere Tipps

Der SKI und BCKW Kalküle abgesehen von dem Lambda-Kalkül steht (die bekannten Anwendungen in der funktionalen Programmierung Konzept haben), weil sie in Punkt freier Form . Siehe auch stillschweigende Programmierung . Sie bilden die Grundlage für das Verständnis, wie ohne benannten Argumente funktionale Programme zu konstruieren.

Wir sehen Anwendungen in bestimmten Sprachen (zB Joy und Cat ). Ich habe einmal posted on Lambda-the-Ultimate.org über die Beziehung von SK Kalkül zu Cat und Freude.

Für das, was ihren Wert. BCKW und SKI (oder SK) Kalküle praktisch identisch ist, aber die BCKW Basis hat die Mode überworfen

Obwohl Lambda und SKI Kalkül spiegeln nicht die Ein- und Ausgabesysteme der meisten Programmiersprachen (wie Grafiken, Netzwerkverbindungen oder wohl auch Standard-Ein- und Ausgang), die Art und Weise praktische Computer-Programmierung ist so strukturiert, entspricht Lambda (und daher SKI und BCKW), wie die Idee der Rekursion und etwas werden die Art und Weise Funktionen aufgerufen. Viele dieser Programmiersprachen haben Lambda-Abstraktionen für die Verwendung als Funktionen.

Es geht um Kontrolle.

Vielleicht auf einem niedrigeren Niveau beginnen. Ein applicative System ist nur ein System, in dem Objekte können auf andere Objekte angewendet werden. Ein einfaches Beispiel eines Systems ist applicative schlag. ls | Mehr Man könnte annehmen, sie in irgendeiner Umgebung sind, und dass die oben genannten Mittel tun ls auf die Umwelt, tun dann mehr. In applicative Notation ist dies more @ (ls @ environment) Allerdings könnte eine kompliziertere Dinge wie ls | grep Muster | Mehr So, jetzt in applicative Notation ist dies more @ ((grep @ Muster) @ (ls @ Umgebung)). Hinweis grep @ Muster. Grep wird ein Muster aufgebracht, welches das Programm zurück zu geben, dass die Muster in der Folge von ls Übereinstimmen. Dies ist der Punkt der Anwendung, ein Programm auf Argumente anwenden, neue Programme aus „atomaren“ (auch bekannt als builtin) Programmen aufzubauen. Wir können aber nicht zu viel Programmierung tun nur mit dem primitiven Anwendung oder builtins. Wir brauchen einen Weg, um unsere Eingabe und die Anwendung unserer Primitiven zu unserem Eingang zu strukturieren.

Dies ist, wo Lambda kommt. Lambda einer Verwendung kann die verallgemeinern (Grep @ Muster) Um die Anwendung grep auf Eingaben, (Grep @ X) Allerdings müssen wir eine Möglichkeit haben, um die Eingabe zu grep zu bekommen. So verwenden wir in der Regel Funktionen. f (X) = X @ grep Der obige Prozess wird als das Argument abstrahieren. Aber es gibt keinen Grund, den Namen f als besonderes zu denken, so dass wir eine Syntax für sie haben: Lambda-X. grep @ X Dann lambda X. grep @ X kann an einen Eingang angelegt werden, und der Eingang wird in den Körper und ausgewertet, substituiert sein. Allerdings kann Substitution chaotisch, gebundene Variablen können lästig sein, auf einer Maschine zu implementieren. S-K-I (oder B, C, K, W) gibt einen Weg Lambda Sachen ersatzlos zu tun, und stattdessen nur Anwendungen tauscht um.

Zur Erinnerung, die Anwendung ist, was es überhaupt geht. Es ist sehr bequem zu Grund auf der Ebene eines Programms, um etwas (möglicherweise ein anderes Programm) Anwendung. Lambda-Kalkül gibt einen Weg, um die Eingabe und Anwendung von Programmen auf Argumente zu strukturieren. SKI gibt einen Weg Lambda zu tun, ohne explizit Ersatz zu haben.

Man sollte beachten, dass SKI Reduktion von Natur aus faul ist, so einige Überlegungen müssen in einer realen Welt Verwendung von SKI zu Strukturanwendung vorgenommen werden. Tatsächlich nun die Argumente vollständig ausgewertet könnten worden sind, und können eine teilweise Anwendung als gut. Man kann dies umgehen, mit einer Art Theorie, und nur ein Programm auf seinem Eingang Auswertung, ob das Programm in der Position des Auftragskopfes ist. Das heißt, wenn man schreibt mit geschlossenem Lambda-Terme, zu SKI übersetzt, dann wenn p @ arg1 @ .... Es soll der Fall sein, dass, wenn p ein primitives Programm ist, dann hat das Neuschreiben abgeschlossen, und so all seine Argumente 1) zur Verfügung, 2) vollständig ausgewertet. Ich habe jedoch nicht beweisen dies, und es könnte nicht mit einer stark genug Typentheorie ...

wahr sein
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top