3
4

1 回答 1

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:

  1. disclose the scalar: ⊃⍵
  2. apply the function: f⊃⍵
  3. enclose the result: ⊂f⊃⍵

A similar expression applies for the dyadic case, x f¨y, but we need to:

  1. disclose both scalars: (⊃⍺)…<code>(⊃⍵)
  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说想要在应用函数时使用整个向量右参数,而这又不需要透露其右参数:

      (¯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 
于 2019-10-05T20:54:02.213 回答