Pregunta

¿Cómo paso una función como argumento?

La idea básica es algo como esto (que no funciona):

∇R ← double a
R ← 2 × a
∇

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

5 applytwice double

¿Hay algo como \fun ¿En Erlang o funciones en C?

¿Fue útil?

Solución

En APL, las funciones no pueden aprobarse como argumentos a las funciones. Sin embargo, APL tiene operadores, que son funciones de orden superior, que pueden tomar funciones como argumentos. Hay operadores primitivos como / (reducción) utilizados, por ejemplo, para resumir un vector + / v. La función + es el operando izquierdo y se pasa al operador /.

En Dyalog APL, hay un operador primitivo que usa (llamado "potencia") para aplicar una función n veces para que podamos escribir:

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

También puede escribir sus propios operadores (en la mayoría de los APL). En Dyalog APL podemos escribir su operador AplicattWice como:

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

Finalmente, puede pasar las funciones colocándolas en un espacio de nombres y pasando el espacio de nombres en su lugar. Esta es como una instancia de clase muy ligera con un método. Por ejemplo:

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

En este caso, la función debe llamarse F, pero podríamos muchas funciones diferentes llamadas F, cada una en su propio espacio de nombres.

Otros consejos

Su aplicada no estaba tan lejos de ser correcta. En Dyalog APL y posiblemente en otros, el código no DFN (definición de funciones heredadas) se vería algo así:

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

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

En APL, cualquier "programa" que acepte cero, uno o dos argumentos de datos es una "función". Las funciones integradas como + - etc. pueden llamarse "funciones primitivas". La doble función en los ejemplos sería una "función definida". Un "operador" acepta funciones y datos como argumentos. + / y + son ejemplos del operador de reducción y escaneo, +es el argumento de la función izquierda para el operador / o . Por el contrario, las funciones de comprimir y expandir usan los mismos símbolos (/ y ) pero tienen un argumento de datos de izquierda.

Tal es la nomenclatura de APL.

También puedes evitar esto por citado. Puede pasar una matriz de char y luego ejecutarla dentro de la función. Esta cadena puede contener el nombre de una función definida o una definición directa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top