APL運算子

在前幾篇文章之中的例子都有使用或者提及 APL運算子(operator),用的時候都沒有好好解說。

主流語言中,運算子一般作用在變數或值之上,以導出新的值。

舉例來說,Java 語言之中有數學運算子、邏輯運算子等等。以邏輯運算子為例,表達式 A != B 中使用了 != 邏輯運算子,假如變數 AB 的值分別為 及 2,那麼表達式即可被演繹為 1 != 2,繼而導出新的布林值 true

APL 之中,運算子並不作用於變數或值,而是函數之上。所返回的是導來函數 (derived function)。以運算子建立的新函數,使用方法與內建函數無異。

舉一個簡單的實例,用 reduce 運算子 / 配合內建函數 +,產生新的函數 sum

+/ 於之前的帖文中出現過好幾次,相信不難理解。另一個頗為有趣的 commute 運算子 ,將函數的左、右參數對調:

F⍨ 的作用就好像導來函數 {⍵ F ⍺}一樣,將自身的左、右參數對調 (即 commute 的本義) 然後輸入至函數 F

再介紹另一個極為強大的 APL 運算子: (power)。好似下面例子:

運算子的左引數為函數 f ,右引數為整數 10,則產生呼叫 f 十次的導來函數。有了 ⍣ 運算子,即時不使用程序語言的 while 迴圈也能做到迭代 (iteration) 的效果。以上例子就好比 C 語言中的 int x = 5; for (int k = 0; k < 10; ++k) { x += 1; }

(Power 運算子的另一個稍為進階的使用例子,可以看看前一篇文章

作為運算子的初步簡介,最後介紹極為常用的 ∘. 外積運算子 (outer product)。配合 ×(乘積)函數說明的話,概念上外積就好像小學生的數學乘法表一樣,將 AB 兩列數分別橫、直排列,再以乘法將兩者的元素結合:

以舉世知名的試算表軟件比擬的話:


不錯,如果 APL 的外積只有這樣的效能的話,就不值得介紹了。APL 的強大之處在於它可以輕易地建立、操作多維度的陣列。如果上面的乘法外積 B∘.×A 再建立以加法建立新的外積的話,便可輕易得出三維(甚至更高維度)的陣列。下面例子就係一個 2 x 10 x 9 的三維陣列:

關於運算子的妙用實在有很多,簡直不勝枚舉。可惜一如其他 APL 語言的範疇一樣,漢語材料幾乎係真空,希望以上簡介可以引起讀者的興趣。

留言

此網誌的熱門文章

APL相關資源

APL Code Golfing

Let's Split!