2014-01-23 18 views
6

Für die Entwicklung von APL zu J, Was ist die Motivation, Gabel einzuführen? Ich denke, es ist schön, (+/ % #) für die Berechnung des Durchschnitts zu haben, aber es macht es auch schwieriger, längere Verb-Zug zu lesen. Gibt es angesichts dieses Kompromisses einen zwingenden Grund für den APL-Erfinder, diesen Stil in J zu wählen?Was ist die Motivation für J, um Gabel einzuführen

+2

Ihre eigene Antwort fasst das Thema recht gut zusammen. Aber ich möchte hinzufügen, warum IMHO die meisten Leute '(+ /% #)' schwerer zu lesen finden als '{(+/⍵) ÷ ≢⍵}'. 1. Die geschweiften Klammern "{}" identifizieren eindeutig, dass eine neue Funktion definiert wird; das ist in Js stillschweigendem Stil überhaupt nicht klar und macht größere Ausdrücke schwerer lesbar (= parse mit dem Auge). 2. Die Syntax zum Kombinieren existierender Funktionen ist dieselbe, egal ob Sie in der funktionalen Tiefe 0 arbeiten (auch bekannt als reguläre Programmierung) oder höher (aka. funktionale Programmierung): '(+/A) ÷ ≢A' vs.' {(+/⍵) ÷ ≢⍵} 'und so weiter. 3. APL-Symbole sind deutlicher und das erleichtert das Lesen. – Tobia

Antwort

4

Danke für Bobs Antwort. Um es stärker zu machen, lernte ich jetzt, dass die Notwendigkeit der Gabelung wie folgt ist.

  • Die Motivation Gabel der Einführung ist stillschweigende Programmierung als Realisierung von Combinatory logic zu implementieren. Sie brauchen dafür eine Art Basis-Kombinator (wie die s-k basis on wiki), und Haken/Gabel bilden eine komplette Basis. Fork oder sein Äquivalent ist zu diesem Zweck wirklich unvermeidlich.

  • Das Konzept der Gabel ist natürlich, wenn man an f + g, f * g denkt. In Mathe meinen sie normalerweise f(x) + g(x) und f(x) * g(x).

  • Dieses Thema wurde in Roger Hui's essay on verb trains schön erklärt.

+0

Ich denke, deine zweite Kugel ist eine wichtige. Für mich fühlt sich J's Züge wie eine höhere Art an, etwas auszudrücken, ähnlich wie 'sum = foldl (+) 0' (oder 'sum =: +/'in J) gegen eine manuelle Schleife, die zu einem Zähler addiert. Umgekehrt, wenn ich einen Ausdruck der Form "x + f (x)" oder "x * f (x)" sehe, denke ich sofort "hey, das ist ein Haken", auch außerhalb von J. – FireFly

3

Ich nehme an, dass Gabel die Motivation hat, vorhandene Funktionen zu kombinieren, um eine neue Funktion zu bilden. Die Zusammensetzung der Funktionen in J wird durch @: oder @ dargestellt, um aus den Funktionen f und g, f @: g eine neue Funktion zu erzeugen. Das heißt, nehmen Sie die Ergebnisse von g und verarbeiten sie mit f

Fork tut das gleiche, aber erlaubt uns, die Ergebnisse von zwei verschiedenen Funktionen (rechte und linke Zinke) mit einer dritten Funktion (Zentral Zinke) zu verarbeiten. Also (f h g) wendet die Ergebnisse von f und g auf die zentrale Zine h an. Das Fork-Konstrukt ist interessant, weil es eine Möglichkeit ist, eine neue Funktion zu erzeugen, indem Funktionen gruppiert werden, ohne dass ein zusätzliches Symbol benötigt wird. Wie Sie darauf hingewiesen haben, ist es erweiterbar, sodass (a b c d e) als (a b (c d e)) gelesen wird, wobei das Ergebnis der Verzweigung c d e als rechte Zacke verwendet wird.