秩 (J编程语言)
秩(Rank)是对标量(非面向阵列)编程语言中循环的推广[1][2]。它还是Lisp语言中的mapcar[3],和现代函数式编程语言中的“map”的推广,和APL\360中的标量扩展、内(矩阵)积和外积的推广。秩的正规实现是在J语言中,但在Dyalog 页面存档备份,存于APL、ISO的扩展APL技术标准和NARS2000中也能获得。
简介
秩有一些不同的含义。一般的说,秩的概念用于依据它们的子阵列来对待正交阵列[4]。例如,二维阵列可以在秩2上,按一个完整的阵列来处理;或者在秩1上,工作于它所包含的一维列或行之上;或在秩0上,工作在它的单独元素之上。J语言中有三种秩:
- 名词秩,名词的秩是非负整数。
- 动词秩,动词的秩是三个整数的列表。
- 秩连词,秩连词
"
用来通过指定的秩导出一个动词。
名词秩
在J中,名词是阵列。名词的秩是这个阵列的维数。派生的动词#@$
确定了一个名词的秩。
人们通常用如下名字称呼低维阵列[5],尽管有时这是有争论的[6]:
一个N维整数阵列可以通过i.
建立,它接受一个整数向量作为参数。其中整数的数目定义了维数而每个整数的绝对值定义对应维的长度。
i. 3
0 1 2
i. 2 3
0 1 2
3 4 5
i. 2 3 4
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
16 17 18 19
20 21 22 23
秩作为循环的推广
理解秩要求知道一些非常基础的面向阵列编程概念。在大多数基于阵列的语言中,归约(reduction)用前向斜杠/
来指示。在J中,斜杠接受一个函数左参数,和要被这个函数归约的阵列作为右参数。
+/ 1 2 3
6
预期的结果是1 + 2 + 3
。
现在我们用加法归约一个二维阵列。
+/ i. 2 3
3 5 7
预期结果是0 1 2 + 3 4 5
。归约下行到每一列,将这一列的所有数都加在一起。
应用+/
到二维阵列对应于如下C语言代码片段[7]:
for(j = 0; j < 3; ++j) {
sum[j] = 0;
}
for(i = 0; i < 2; ++i) {
for(j = 0; j < 3; ++j) {
sum[j] += array[i][j];
}
}
假定我们希望合计每一列的项目,如在C语言代码中:
for(i = 0; i < 2; ++i) {
sum[i] = 0;
for(j = 0; j < 3; ++j) {
sum[i] += array[i][j];
}
}
要生成这个结果3 12
。我们在J中不用循环,可以简单的使用秩连词:
+/"1 i. 2 3
3 12
为了进一步展示在J中秩是如何工作的,我们可以将最初的表达式看作是秩2。算符被映射到这个阵列的最高秩之上。
+/"2 i. 2 3
3 5 7
动词秩
在J中,动词是接受名词参数产生名词结果的函数。动词的秩控制着动词如何应用到秩大于0的名词。这个动词秩被表达为三个数:
- 一元情况的秩
- 二元情况用于左参数的秩
- 二元情况用于右参数的秩
例如,−y
使用−
作为单子是一元情况,x−y
使用−
作为二元体是二元情况。在所有情况下,有一些底层动词被应用于“单元”(cell),它是指示秩的子阵列。如果参数没有那么多维,就是整个参数。
在动词中,负数秩被解释为作为参数提供的名词秩减少指示的值。(但永不小于零。)例如,一个动词具有一元秩负1,在给它一个秩3的参数的时候,将参数分解成秩2整列的一个列表。动词的主体被应用到这些二维子阵每个之上一次。
在特定动词和特定名词的上下文下,名词的诸维被分开成前缀维的序列,叫做框架(frame);和后缀维的序列,叫做单元(cell)。正数动词秩指示单元维的数目,负数动词秩指示框架维的数目。
在二元的情况下,有两个框架:一个用于左参数,而另一个用于右参数。这些框架必须一致。如果框架不同一,一个必须是另一个的前缀;例如:(i. 2 3) *"0 1 i. 2 3 4
,将左侧的每个标量(0维项目)乘以右侧的每个向量(1维项目)。求值这个动词的结果将有最长框架的维数作为结果的前缀维。跟随着结果维,如果有的话,将是动词应用到有关单元的结果。在退化的情况下,参数没有足够的维数,动词的秩被有效的缩减(这将影响它的结果)。例如:
10 + 4 5 6
14 15 16
这里的动词+
有秩0 0 0,左参数有秩0,而右参数有秩1(长度3的1维)。因此,左参数有秩0框架而右参数有秩1框架(维长度3)。左参数的(空)框架是右参数的框架的有效后缀,所以这是一个有效的运算,结果有秩1和维长度3。
秩连词
秩连词接受一个动词左参数和一个名词右参数来建立一个新动词。名词右参数构成自三个数,分别指定一元秩、二元左秩和二元右秩[8]。
如果右参数只有两个数,它们被接受为二元情况下的秩:第一个数是左参数的秩,而第二个数是右参数的秩。所以,如果我们想要将一个向量加到一个矩阵的每个向量:
1 2 3 +"1 1 i. 3 3
1 3 5
4 6 8
7 9 11
如果我们转而想将左侧的每个标量加到右侧的每个向量上,我们将如下这么做:
1 2 3 +"0 1 i. 3 3
1 2 3
5 6 7
9 10 11
如果右参数只有一个数,它被接受为所有三种情况下的秩。
如果右参数是个动词,就使用它的秩。例如,如下这些都派生相同的动词:
* +"0 0 0
* +"0 0
* +"0
* +"+
如果给秩连词的左参数是个名词,建立一个常量动词。这个动词的主体忽略任何参数的值,并总是生成这个名词的结果。
引用
- Slepak, Justin; Shivers, Olin; Manolios, Panagiotis. (PDF). [2020-05-19]. (原始内容存档 (PDF)于2020-01-10).
- . Jsoftware. [2020-05-19]. (原始内容存档于2019-01-03).
- . Free Software Foundation. [2020-05-19]. (原始内容存档于2020-01-09).
- Bernecky, R. . . December 1987.
- Rabanser, Stephan; Shchur, Oleksandr; Günnemann, Stephan. . 2017-11-29. arXiv:1711.10781 [stat.ML].
- kgwgk; nabla9; azag0; tome; radarsat1. . Hacker News. Y Combinator. 2017-04-24 [2019-12-10]. (原始内容存档于2018-09-07).
- . Jsoftware. [2020-05-19]. (原始内容存档于2019-01-03).
- Burke, Chris. . Jsoftware. 2014-09-12 [2020-05-19]. (原始内容存档于2018-09-06).
延伸阅读
- Abrams, P.S. . (PDF). Stanford University (PhD). February 1970 [2020-05-19]. (原始内容存档 (PDF)于2016-03-05).
- Backus, J.W., Can Programming be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs (https://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf 页面存档备份,存于), Communications of the ACM, Volume 21, Number 8, 1978-08.; §11.3.3.
- Bernecky, R., An Introduction to Function Rank (https://dl.acm.org/citation.cfm?id=55632), APL88 Conference Proceedings, APL Quote Quad, Volume 18, Number 2, 1987-12.
- Bernecky, R.; Iverson, K.E. . . 1980 APL Users Meeting. Jsoftware. 6–8 October 1980 [2020-05-19]. (原始内容存档于2016-03-16).
- Bernecky, R.; Iverson, K.E.; McDonnell, E.E.; Metzger, R.C.; Schueler, J.H. . Jsoftware. I.P. Sharp Associates Limited. 1983-05-02 [2020-05-19]. (原始内容存档于2019-02-13).
- Brown, J.A., The Principles of APL2 (http://www.softwarepreservation.org/projects/apl/Papers/PRINCIPLESOFAPL2 页面存档备份,存于), TR 03.247, IBM Santa Teresa Laboratory, San Jose, California, 1984-03; §20.0.
- Dyalog, Dyalog APL Version 14.0 Release Notes (http://www.dyalog.com/dyalog-version-140.htm), Dyalog Limited, 2015.
- Hui, R.K.W., Rank and Uniformity (http://www.jsoftware.com/papers/rank.htm 页面存档备份,存于), APL95 Conference Proceedings, APL Quote Quad, Volume 25, Number 4, 1995-06.
- Hui, R.K.W., Remembering Ken Iverson (https://web.archive.org/web/20191220153001/http://keiapl.org/rhui/remember.htm), 2004-11.
- Hui, R.K.W., Inner Product—An Old/New Problem (http://www.jsoftware.com/papers/innerproduct/ip.htm 页面存档备份,存于), British APL Association Conference 2009, 2009-06-08.
- Iverson, K.E., Operators and Functions (http://www.jsoftware.com/papers/opfns.htm 页面存档备份,存于), Research Report #RC7091, IBM, 1978-04-26.
- Iverson, K.E., A Dictionary of APL (http://www.jsoftware.com/papers/APLDictionary.htm 页面存档备份,存于), APL Quote Quad, Volume 18, Number 1, 1987-09.
- Iverson, K.E., A Personal View of APL (http://www.jsoftware.com/papers/APLPersonalView1.htm 页面存档备份,存于), IBM Systems Journal, Volume 30, Number 4, 1991-12.
- Slepak,Justin; Shivers, Olin; Manolios, Panagiotis, An array-oriented language with static rank polymorphism (http://www.ccs.neu.edu/home/jrslepak/typed-j.pdf 页面存档备份,存于).