1 回答
使用Each的表达式,如f¨x,可以用Rank表示为{⊂f⊃⍵}⍤0⊢x(注意⊢</code> is to separate the array right operand, 0 from the array right argument x). In other words, on the scalars of the argument we:
- disclose the scalar:
⊃⍵
- apply the function:
f⊃⍵
- enclose the result:
⊂f⊃⍵
A similar expression applies for the dyadic case, x f¨y, but we need to:
disclose both scalars:(⊃⍺)…<code>(⊃⍵)- 应用功能:
(⊃⍺)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说想要在应用函数时使用整个向量右参数,而这又不需要透露其右参数:
(¯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