Question

Comment passer une fonction comme un argument?

L'idée de base est quelque chose comme ça (ce qui ne fonctionne pas):

∇R ← double a
R ← 2 × a
∇

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

5 applytwice double

Y a-t-il quelque chose comme \fun en erlang ou en fonction des fonctions en c?

Était-ce utile?

La solution

Dans APL, les fonctions peuvent ne pas être adoptées comme arguments aux fonctions. Cependant, APL a des opérateurs, qui sont des fonctions d'ordre supérieur, qui peuvent prendre des fonctions comme des arguments. Il existe des opérateurs primitifs comme / (réduction) utilisés par exemple pour résumer un vecteur + / v. La fonction + est l'opérande gauche et est transmise dans l'opérateur /.

Dans Dyalog APL, il existe un opérateur primitif utilisant le (nommé "Power") pour appliquer une fonction n fois afin que nous puissions écrire:

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

Vous pouvez également écrire vos propres opérateurs (dans la plupart des APL). Dans Dyalog APL, nous pouvons écrire votre opérateur ApplicationTwice comme:

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

Enfin, vous pouvez passer des fonctions en les mettant dans un espace de noms et en transmettant l'espace de noms à la place. C'est comme une instance de classe très légère avec une méthode. Par exemple:

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

Dans ce cas, la fonction doit être nommée F, mais nous pourrions de nombreuses fonctions différentes nommées F, chacune dans son propre espace de noms.

Autres conseils

Votre application était si loin d'être correct. Dans Dyalog APL et éventuellement d'autres, le code non DFN (Définition de la fonction héritée) ressemblerait à ceci:

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

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

Dans APL, tout "programme" qui accepte zéro, un ou deux arguments de données est une "fonction". Des fonctions intégrées telles que + - etc. peuvent être appelées "fonctions primitives". La double fonction dans les exemples serait une "fonction définie". Un "opérateur" accepte les fonctions et les données comme arguments. + / et + sont des exemples de l'opérateur de réduction et de scan, + est l'argument de la fonction de la fonction pour l'opérateur / . En revanche, les fonctions de compression et d'extension utilisent les mêmes symboles (/ et ) mais ont un argument de données gauche.

Telle est la nomenclature APL.

Vous pouvez également contourner cela par citation. Vous pouvez passer un tableau char, puis l'exécuter dans la fonction. Cette chaîne peut contenir le nom d'une fonction définie ou d'une définition directe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top