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