如何在 APL 中使用排名运算符而不是每个

How to use rank operator instead of each in APL

我有

dummytxt←'abcdefghijk'
texttoadd←'down'
rfikv←20 30 50

并需要以下输出

 defghijk20down  defghijk30down  defghijk50down 

我可以用:

scenv←(¯10↑¨(⊂dummytxt),¨⍕¨rfikv),¨⊂texttoadd

但请帮我写出没有每个运算符但使用等级

我使用 Dyalog APL,但请不要使用火车。

谢谢

使用 Each 的表达式,如 f¨x,可以根据 Rank 表示为 {⊂f⊃⍵}⍤0⊢x(请注意, 是将数组右操作数 0 与数组右参数 x 分开。换句话说,在参数的标量上我们:

  1. 公开标量:⊃⍵
  2. 应用函数:f⊃⍵
  3. 附上结果:⊂f⊃⍵

类似的表达式适用于二元情况,x f¨y,但我们需要:

  1. 公开两个标量:(⊃⍺)(⊃⍵)
  2. 应用函数:(⊃⍺)f(⊃⍵)
  3. 附上结果:⊂(⊃⍺)f(⊃⍵)

这给了我们 x{⊂(⊃⍺)f(⊃⍵)}⍤0⊢y。因此,我们可以使用 Rank 来构建我们自己的 Each 运算符,它允许派生函数的单子和二元应用程序:

      Each←{⍺←⊢ ⋄ ⍺ ⍺⍺{×⎕NC'⍺':⊂(⊃⍺)⍺⍺(⊃⍵) ⋄ ⊂⍺⍺⊃⍵}⍤0⊢⍵}
      (¯10↑Each(⊂dummytxt),Each⍕Each rfikv),Each⊂texttoadd
 defghijk20down  defghijk30down  defghijk50down 

或者,我们可以将两个更简单的等价代入您的表达式中:

      (¯10{⊂(⊃⍺)↑(⊃⍵)}⍤0⊢(⊂dummytxt){⊂(⊃⍺),(⊃⍵)}⍤0{⊂⍕⊃⍵}⍤0⊢rfikv){⊂(⊃⍺),(⊃⍵)}⍤0⊂texttoadd
 defghijk20down  defghijk30down  defghijk50down 

请注意,我们将 texttoadd 括起来,因此它变成了标量,然后我们使用 ⍤0 来处理整个标量,只是为了再次公开它。相反,我们可以使用 ⍤0 1 表示在应用函数时想要使用整个 vector 右参数,而这又不需要公开其右参数:

      (¯10{⊂(⊃⍺)↑(⊃⍵)}⍤0⊢(⊂dummytxt){⊂(⊃⍺),(⊃⍵)}⍤0{⊂⍕⊃⍵}⍤0⊢rfikv){⊂(⊃⍺),⍵}⍤0 1⊢texttoadd
 defghijk20down  defghijk30down  defghijk50down 

rfikv¯10 是一个简单的标量,因此公开它们没有任何效果:

      (¯10{⊂⍺↑(⊃⍵)}⍤0⊢(⊂dummytxt){⊂(⊃⍺),(⊃⍵)}⍤0{⊂⍕⍵}⍤0⊢rfikv){⊂(⊃⍺),⍵}⍤0 1⊢texttoadd
 defghijk20down  defghijk30down  defghijk50down 

dummytxt 和上面的 texttoadd 是一样的情况,但是作为左参数,所以我们可以跳过 enclose-disclose 并要求 Rank 使用整个向量左参数; ⍤1 0:

      (¯10{⊂⍺↑(⊃⍵)}⍤0⊢dummytxt{⊂⍺,(⊃⍵)}⍤1 0{⊂⍕⍵}⍤0⊢rfikv){⊂(⊃⍺),⍵}⍤0 1⊢texttoadd
 defghijk20down  defghijk30down  defghijk50down 

这与使用通用方法一样简单。然而,如果我们观察到唯一的非标量是 rfikv,我们可以将 dummytxttexttoadd 视为全局常量并将整个事物表示为单个 ⍤0 函数rfikv 上的申请:

      {⊂(¯10↑dummytxt,⍕⍵),texttoadd}⍤0⊢rfikv
 defghijk20down  defghijk30down  defghijk50down 

当然,每个也可以这样做:

      {(¯10↑dummytxt,⍕⍵),texttoadd}¨rfikv
 defghijk20down  defghijk30down  defghijk50down