将函数作为APL中的参数传递

Hyp*_*eus 5 function-pointers function apl argument-passing

如何将函数作为参数传递?

基本的想法是这样的(这是行不通的):

?R ? double a
R ? 2 × a
?

?R ? a applytwice f
R ? f f a
?

5 applytwice double
Run Code Online (Sandbox Code Playgroud)

\fun在C中是否有类似erlang或函数指针的东西?

Pau*_*our 9

在APL中,函数不能作为参数传递给函数.但是,APL具有更高阶函数的运算符,它们可以将函数作为参数.有原始运算符,例如/(减少)用于例如总结向量+/v.函数+是左操作数,并传递给operator /.

在Dyalog APL中,有一个原始运算符使用(命名为"power")来应用函数n次,因此我们可以编写:

      double?{2×?}
      (double ? 2) 7
28
      (double ? 10) 7
7168
Run Code Online (Sandbox Code Playgroud)

您也可以编写自己的运算符(在大多数APL中).在Dyalog APL中,我们可以将您的applytwice运算符编写为:

     applytwice?{?? ?? ?}
     double applytwice 7
28
Run Code Online (Sandbox Code Playgroud)

最后,您可以通过将函数放入命名空间并传递命名空间来传递函数.这就像一个非常轻量级的类的实例和方法.例如:

       s??NS ''
       s.f?{2×?}
       ApplyFTwice?{?.f ?.f ?}
       s ApplyFTwice 7
28
Run Code Online (Sandbox Code Playgroud)

在这种情况下,函数必须命名为f,但是我们可以使用名为f的许多不同函数,每个函数都在自己的命名空间中.


Lob*_*sky 5

你的两次申请并没有那么正确。在 Dyalog APL 和可能的其他人中,非 dfn(遗留函数定义)代码看起来像这样:

       ? R ? (f applytwice) a
  [1]   R ? f f a
       ?

       - applytwice 42
  42

       {2×?} applytwice 42
  168
Run Code Online (Sandbox Code Playgroud)

在 APL 中,任何接受零、一个或两个数据参数的“程序”都是一个“函数”。+ - 等内置函数可能被称为“原始函数”。示例中的 double 函数将是一个“定义函数”。“运算符”接受函数和数据作为参数。+/ 和 +\ 是缩减和扫描运算符的示例,+ 是 / 或 \ 运算符的函数左参数。相比之下, compress 和 expand 函数使用相同的符号(/ 和 \ ),但有一个左数据参数。

这就是 APL 命名法。

  • ∇ R ← a (f upper g) b // 相同的想法,关于数据和函数的二元关系。调用方式类似于 42 (+ 更高 -) 13 (2认同)