如何在 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
分开。换句话说,在参数的标量上我们:
- 公开标量:
⊃⍵
- 应用函数:
f⊃⍵
- 附上结果:
⊂f⊃⍵
类似的表达式适用于二元情况,x f¨y
,但我们需要:
- 公开两个标量:
(⊃⍺)
…(⊃⍵)
- 应用函数:
(⊃⍺)f(⊃⍵)
- 附上结果:
⊂(⊃⍺)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
,我们可以将 dummytxt
和 texttoadd
视为全局常量并将整个事物表示为单个 ⍤0
函数rfikv
上的申请:
{⊂(¯10↑dummytxt,⍕⍵),texttoadd}⍤0⊢rfikv
defghijk20down defghijk30down defghijk50down
当然,每个也可以这样做:
{(¯10↑dummytxt,⍕⍵),texttoadd}¨rfikv
defghijk20down defghijk30down defghijk50down
我有
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
分开。换句话说,在参数的标量上我们:
- 公开标量:
⊃⍵
- 应用函数:
f⊃⍵
- 附上结果:
⊂f⊃⍵
类似的表达式适用于二元情况,x f¨y
,但我们需要:
- 公开两个标量:
(⊃⍺)
…(⊃⍵)
- 应用函数:
(⊃⍺)f(⊃⍵)
- 附上结果:
⊂(⊃⍺)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
,我们可以将 dummytxt
和 texttoadd
视为全局常量并将整个事物表示为单个 ⍤0
函数rfikv
上的申请:
{⊂(¯10↑dummytxt,⍕⍵),texttoadd}⍤0⊢rfikv
defghijk20down defghijk30down defghijk50down
当然,每个也可以这样做:
{(¯10↑dummytxt,⍕⍵),texttoadd}¨rfikv
defghijk20down defghijk30down defghijk50down