秩（Rank），是對非面向陣列的標量程式語言中迴圈的廣泛化。它還是 Lisp 語言中的 mapcar，及現代函數語言程式設計語言中的 map 高階函式的廣泛化，以及對 APL360 中標量擴充套件、矩陣的內積和外積的廣泛化。秩的正規實現，是在 J 語言中，但也可獲得於 APL 語言實現如 Dyalog APL、ISO 標準 ISOIEC 137512001 的擴充套件 APL 和 NARS2000。 簡介 秩有一些不同的含義。一般的說，秩的概念用於依據它們的子陣列來處理。例如，二維陣列可以在秩為 2 之下，按一個完整的矩陣進行處理；或者在秩為 1 之下，對它所包含的諸個一維列向量或行向量進行處理；或者在秩為 0 之下，對它所包含的諸個單獨元素進行處理。J 語言中有三種秩： 名詞秩，名詞的秩是非負整數。 動詞秩，動詞的秩是三個整數的列表。 秩連詞，秩連詞 用來匯出具有指定秩的一個動詞。 名詞秩 在 J 語言中，名詞是。名詞的秩是這個陣列的維數。儘管有時存在爭論，人們通常用如下名字稱謂低維陣列： 名字 名字 秩 原子 標量 0 列表 向量 1 表格 矩陣 2 立體 張量 3 一個 N 維整數陣列可以透過 i 建立，它接受一個整數向量作為引數。其中整數的數目定義了維數，而每個整數的絕對值定義對應維的長度。可以使用派生動詞 來確定一個名詞的秩。 i 3 0 1 2 i 3 1 2 3 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 i 2 3 4 3 動詞秩 在 J 語言中，動詞是接受名詞引數產生名詞結果的函式。動詞的秩，控制著如何將動詞應用到秩大於 0 的名詞。採用副詞 u b 0 來確定動詞 u 的秩。例如： b 0 0 0 0 b 0 _ _ _ 這裡的_無窮，指示將引數作為整體處理。動詞的秩被表達為三個數： 一元情況的秩 二元情況用於左引數的秩 二元情況用於右引數的秩 例如，y 使用作為單子（monad），是一元情況；xy 使用作為雙子（dyad），是二元情況。在所有情況下，有一些底層動詞被應用於 單元（cell），它是有指示秩的子陣列。如果引數沒有動詞指示的那麼多維，在這種退化的情況下，動詞的秩會有效的縮減為引數實際的秩。 在動詞中，負數秩被解釋為，將提供為引數的名詞的秩，減少指示正值，但永不會變得小於零。例如，一個動詞具有一元秩負 1，在給它一個秩為 3 的引數的時候，將引數分解成秩為 2 的陣列的一個列表。將動詞的主體，應用到這些二維子陣每個之上一次。 在特定動詞和特定名詞的上下文下，將名詞的諸維，劃分成字首諸維的序列，稱為框架（frame）；和字尾諸維的序列，稱為單元（cell）。正數動詞秩，指示單元諸維的數目，負數動詞秩，指示框架諸維的數目。 秩連詞 秩連詞 ，接受一個動詞左引數和一個名詞右引數來建立一個新動詞。 名詞右引數構成自三個數，分別指定一元秩、二元左秩和二元右秩。如果右引數只有兩個數，第一個數是二元左秩，而第二個數是一元秩和二元右秩。如果右引數只有一個數，它被接受為所有三種情況下的秩。如果右引數是個動詞，就複製使用它的秩。例如： 1 1 1 b 0 1 1 1 0 _ b 0 _ 0 _ 1 b 0 1 1 1 b 0 _ 0 0 如果給秩連詞的左引數是個名詞，建立一個常量動詞。這個動詞的主體忽略任何引數的值，並總是生成這個名詞的結果。 框架一致 在二元運算的情況下，左右兩個引數，都有自己的框架，二者必須達成一致（agreement）。左右兩框架經常是共同的。如果左右兩框架不是同一的，有三種可以運算的情況： 兩引數中一個的形狀序列，是另一個的形狀序列的字首，例如： i 2 3 i 2 3 4 0 0 0 0 4 5 6 7 16 18 20 22 36 39 42 45 64 68 72 76 100 105 110 115 這裡左側引數的短框架 2 3，是右側引數的長框架 2 3 4 的字首。求值這個動詞的結果，跟隨著字首諸維序列 2 3，是二元動詞應用到兩個有關單元的結果，即將左引數的每個 0 維標量，乘以右引數的每個 1 維陣列。 兩引數中一個的形狀序列，是另一個的形狀序列的字尾，可以透過秩連詞，指定動詞秩為維數少引數的秩，從而對它按整體處理，例如： i 3 4 2 i 2 3 4 0 1 4 9 16 25 36 49 64 81 100 121 0 13 28 45 64 85 108 133 160 189 220 253 這裡左側引數的短框架 3 4，是右側引數的長框架 2 3 4 的字尾。求值這個動詞的結果，跟隨著字首諸維序列 2，是二元動詞應用到兩個有關單元的結果，即將左引數的作為整體的 1 個 2 維陣列，乘以右引數相同形狀的每個 2 維陣列。 指定動詞左右秩中的一個為_，即按整體處理，例如： i2 3 0 _ i3 4 2 3 3 4 i2 3 _ 0 i3 4 3 4 2 3 i2 3 1 _ i3 4 2 3 4 i2 3 _ i2 3 4 2 3 4 這裡第一個運算的左秩為 0，而右秩為按整體處理；求值的結果中跟隨著左引數的諸維序列 2 3 的，是將左引數的每個 0 維標量，乘以右引數的作為整體的 2 維陣列的結果。第二個運算的左右秩與第一個運算相反，其結果中來自二者的諸軸的前後次序也與之相反。第三個運算的左秩為 1，而右秩為按整體處理；跟隨著左引數的諸維序列 2 的，是將左引數的每個 1 維向量，乘以右引數的作為整體的 2 維陣列的結果。第四個運算的左右秩都按整體處理，則同於字首情況。 秩作為迴圈的泛化 理解秩要求知道一些非常基礎的面向陣列程式設計概念。在大多數基於陣列的語言中，歸約（reduction）用前向斜槓 來指示。在 J 語言中，斜槓接受一個函式左引數，和要被這個函式歸約的陣列作為右引數。將加法歸約應用到一個 1 維陣列： 1 2 3 6 預期的結果是 1 2 3。 將加法歸約應用到一個 2 維陣列： i 2 3 3 5 7 預期結果是 0 1 2 3 4 5。 的秩為_無窮，即將引數作為整體來運算， 算符被對映到這個陣列的最高秩之上。對 2 個向量進行歸約，引數名詞的形狀從 2 3 變為 1 3 即 3，結果是合計了每行元素的長度為 3 的 1 維陣列。這個程式碼對應如下 APL2 及其派生者的程式碼： 2 36 3 5 7 還對應於如下 C 語言程式碼片段： for j 0 j 3 j sum j 0 for i 0 i 2 i for j 0 j 3 j sum j array ij 假定需要合計每列元素，而得到長度為 2 的 1 維陣列，在 C 語言程式碼中如下這樣寫： for i 0 i 2 i sum i 0 for j 0 j 3 j sum i array ij 在 APL 中不需要用到迴圈構造，這個程式碼寫為： 2 36 3 12 在 J 語言中使用秩連詞可以寫為： 1 i 2 3 3 12 _1 i 2 3 3 12 為了進一步展示在 J 語言中秩是如何工作的，以 3 維陣列上的加法歸約為例子： a i 2 3 4 a 12 14 16 18 20 22 24 26 28 30 32 34 _1 a 12 15 18 21 48 51 54 57 _1 a 2 a 1 1 a 6 22 38 54 70 86 1 a _2 a 1 引用 延伸閱讀 Backus JW Can Programming be Liberated from the von Neumann Style A Functional Style and Its Algebra of Programs httpswwwthocpnetbiographiespapersbackus_turingaward_lecturepdf Communications of the ACM Volume 21 Number 8 197808 1133 Bernecky R An Introduction to Function Rank httpsdlacmorgcitationcfmid55632 APL88 Conference Proceedings APL Quote Quad Volume 18 Number 2 198712 Brown JA The Principles of APL2 httpwwwsoftwarepreservationorgprojectsaplPapersPRINCIPLESOFAPL2 TR 03247 IBM Santa Teresa Laboratory San Jose California 198403 200 Dyalog Dyalog APL Version 140 Release Notes httpwwwdyalogcomdyalogversion140htm Dyalog Limited 2015 Hui RKW Rank and Uniformity httpwwwjsoftwarecompapersrankhtm APL95 Conference Proceedings APL Quote Quad Volume 25 Number 4 199506 Hui RKW Remembering Ken Iverson httpswebarchiveorgweb20191220153001httpkeiaplorgrhuirememberhtm 200411 Hui RKW Inner ProductAn OldNew Problem httpwwwjsoftwarecompapersinnerproductiphtm British APL Association Conference 2009 20090608 Iverson KE Operators and Functions httpwwwjsoftwarecompapersopfnshtm Research Report RC7091 IBM 19780426 Iverson KE A Dictionary of APL httpwwwjsoftwarecompapersAPLDictionaryhtm APL Quote Quad Volume 18 Number 1 198709 Iverson KE A Personal View of APL httpwwwjsoftwarecompapersAPLPersonalView1htm IBM Systems Journal Volume 30 Number 4 199112 SlepakJustin Shivers Olin Manolios Panagiotis An arrayoriented language with static rank polymorphism httpwwwccsneueduhomejrslepaktypedjpdf 外部連結 J Dictionary entry for rank Rank in Learning J CategoryAPL 程式語言家族