Frage

Wie übergebe ich eine Funktion als Argument?

Die Grundidee ist etwa so (was nicht funktioniert):

∇R ← double a
R ← 2 × a
∇

∇R ← a applytwice f
R ← f f a
∇

5 applytwice double

Gibt es so etwas wie \fun in Erlang oder Funktionszeiger in C?

War es hilfreich?

Lösung

In APL werden Funktionen möglicherweise nicht als Argumente an Funktionen übergeben. APL hat jedoch Operatoren, die Funktionen höherer Ordnung sind, die Funktionen als Argumente annehmen können. Es gibt primitive Operatoren wie / (Reduktion), die zum Beispiel verwendet werden, um einen Vektor + / V zusammenzufassen. Die Funktion + ist der linke Operand und wird in den Bediener übergeben /.

In Dyalog APL gibt es einen primitiven Operator, der die (benannte "Power") für die Anwendung einer Funktion n -mal verwendet, damit wir schreiben können:

      double←{2×⍵}
      (double ⍣ 2) 7
28
      (double ⍣ 10) 7
7168

Sie können auch Ihre eigenen Bediener schreiben (in den meisten APLs). In Dyalog APL können wir Ihren Antragsbetreiber als:

     applytwice←{⍺⍺ ⍺⍺ ⍵}
     double applytwice 7
28

Schließlich können Sie Funktionen übergeben, indem Sie sie in einen Namespace stellen und den Namespace stattdessen übergeben. Dies ist wie eine sehr leichte Klasseninstanz mit einer Methode. Zum Beispiel:

       s←⎕NS ''
       s.f←{2×⍵}
       ApplyFTwice←{⍺.f ⍺.f ⍵}
       s ApplyFTwice 7
28

In diesem Fall muss die Funktion F genannt werden, aber wir könnten viele verschiedene Funktionen mit F, jeweils in ihrem eigenen Namespace.

Andere Tipps

Ihre Bewerbung zweimal war gar nicht so weit von der Richtigkeit entfernt.In Dyalog APL und möglicherweise anderen würde der Nicht-DFN-Code (Legacy Function Definition) etwa so aussehen:

       ∇ R ← (f applytwice) a
  [1]   R ← f f a
       ∇

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

In APL ist jedes „Programm“, das null, ein oder zwei Datenargumente akzeptiert, eine „Funktion“.Integrierte Funktionen wie + - usw.könnte als „primitive Funktionen“ bezeichnet werden.Die Doppelfunktion in den Beispielen wäre eine „definierte Funktion“.Ein „Operator“ akzeptiert Funktionen und Daten als Argumente.+/ und +\ sind Beispiele für den Reduktions- und Scan-Operator, + ist das linke Funktionsargument für den /- oder \-Operator.Im Gegensatz dazu verwenden die Funktionen zum Komprimieren und Erweitern dieselben Symbole (/ und \), verfügen jedoch über ein linkes Datenargument.

Dies ist die APL-Nomenklatur.

Sie können dies auch umgehen Zitieren. Sie können ein Char -Array übergeben und es dann innerhalb der Funktion ausführen. Diese Zeichenfolge kann den Namen einer definierten Funktion oder eine direkte Definition enthalten.

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