隱式（tacit）程式設計，或稱為函式級程式設計，是一種程式設計範型，也叫做無點（pointfree）樣式。其中函式定義不標示所要運算的被稱為 點 的引數，轉而函式定義只是其他函式的複合，比如那些操縱引數的組合子。隱式程式設計有著理論價值，因為嚴格的使用複合導致程式適配於 Manuel Alcino Pereira da Cunha 2005 Pointfree Program Calculation。隱式程式設計是特定程式語言的天然樣式，這包括了 APL 的一些現代實現和方言 W Neville Holmes ed 2006 Computers and People，和串接式語言比如 Forth。由於缺少引數命名，認為這種風格導致了不必要的晦澀難懂的人，給它起了個綽號叫做 無意義（pointless）風格。 APL 語言家族 在一些 APL 方言中，允許將函式組合入服從幾個規則的 列車（train）；這允許建立複雜的派生函式，而不需要顯式指定任何引數；實現了列車的 APL 方言包括：J 語言、Dyalog APL、dzaimaAPL、ngnapl 和 NARS2000。 J 語言 在 J 語言中，下列在一個數值的列表（陣列）上計算平均值的函式採用了一種無引數樣式程式碼： avg 透過將求和插入到一個陣列的所有元素之間來計算它們的合計值。 總計一個陣列的元素數目。 用 這個陣列的結果值除以 這個陣列的結果值。 尤拉公式 eix cos x isin x 可隱式表達為： cos 2 o sin 1 o Euler j cos j sin 這裡定義的函式 Euler 在任何輸入值上都恆等於 1，即這個等式永遠為真。其中用到了一些原語（primitive）函式： 表示全域性定義；o 表示圓函式，由左側名詞引數選擇具體的函式； 不變動的返回右側名詞引數； 的一元定義為指數函式；j 的一元定義為虛數單位 0j1 乘以右側引數 y，而它的二元定義為 x 0j1y，即組合左側引數 x 和右側引數 y 成為複數，而二者分別是其實部和虛部；表示數學函式複合； 是等於布林運算，兩側引數相等返回 1 而不等返回 0。 Dyalog APL 上述相同的隱式計算用 APL 的現代版本 Dyalog APL 表達為： avg cos 2 sin 1 j 0 0j1 j 函式的定義不是隱式的 Euler j cos j sin 這裡採用定義了 j 函式，其中在 與 之間由分隔的是守衛的表示式序列（這裡只有表示式），指示左引數而指示右引數，指示一元定義需要的預設左引數。 Unix 管道 在 Unix shell 指令碼中，命令是從標準輸入接收資料併發送結果至標準輸出的。例如： sort uniq c sort rn 可以視為一個隱式或無點複合，它返回它的每個引數的計數和這些引數，並按照這個計數的遞減次序來排序。命令 sort 和 uniq 相當於函式，而 c 和 rn 是控制這些函式的選項，但是不提及引數。管道 相當於函式複合運算元。下面是其用例： echo 2 4 3 1 3 12 2 xargs n1 sort uniq c sort rn 2 3 2 2 1 4 1 12 1 1 Python 如下 Python 程式碼是對應上節示例中 Unix 管道中命令的函式定義和一序列的運算： def sort argv return sorted argv keystr def uniq_c argv counts for i in argv counts str i countsget str i 0 1 return v int k for k v in countsitems def sort_rn argv sort_rk2 sorted argv keylambda xstr x 1 reverseTrue return sorted sort_rk2 keylambda xx 0 reverseTrue a 2 4 3 1 3 12 2 b sort_rn uniq_c sort a 這裡的 sort 由於 uniq_c 所採用的實現方法不再依賴於它而沒有存在必要，只是為了與上節 Unix 示例保持一致。 基於標準庫的函數語言程式設計工具 functools 中的函式 partial 和歸約函式 reduce ，這個例子可以寫為無點樣式的沒有引數的一序列函式的複合： from functools import partial reduce def compose func_list return partial reduce lambda argvfuncfunc argv func_list pipeline compose sort uniq_c sort_rn c pipeline a assert b c jq 語言 jq 是面向 JSON 的純函數語言程式設計語言，它使用 符號來連線過濾器形成流水線。例如： echo 12 jq addlength 15 jq n 12 addlength 15 這裡 jq 內的 JSON 陣列 12 是求值為陣列的一個 jq 過濾器。儘管類似於 Unix 流水線，jq 流水線允許將到來資料，如同並行的傳送到在 右手端的多於一個接收者。 上述 Python 章節中例子，在 jq 中等價的無點風格定義為： def uniq_c map tostring reduce as i i 1 to_entries map value key def sort_nr sort reverse map 0 1tonumber 2 4 3 1 3 12 2 sort uniq_c sort_nr 函數語言程式設計語言 下面是採用純函數語言程式設計語言 Haskell 的一個簡單例子，它在一個列表上作合計的函式。程式設計者可以使用 有點（pointed）也稱為值級程式設計的方法，而遞迴的定義這個合計為： sum xxs x sum xs sum 0 這是一種摺疊（fold）運算，程式設計者可以將它改寫為： sum xs foldr 0 xs 這裡的引數是不必須的，進而將它改寫成如下 無點 也稱為函式級程式設計的樣式： sum foldr 0 Haskell 擁有運算元： b c a b a c f g x f g x 它有如下性質： f g f g f g f g f g f g f g g f 這裡的 f 和 g，分別稱為。的左 節（section）和右 節，是對這個中綴運算元的左側和右側。f f，本文采用後者形式。正如前面所說，在 無點 中的點（point）指稱引數，而非不使用點號（dot），這是常見誤解。 下面的例子展示其用法，給出一個函式 p 的定義： p x y z f g x y z 經過如下推導： p x y z f g x y z x y z f g x y z x y f g x y x y f g x y x f g x x f g x x f g x f g 它可以歸約成無點的等價定義： p f g 下面是一個複雜一些的例子，這裡的 mf 是一個先做對映（map）再加過濾器（filter）的函式，它接受一個列表 list，向它應用一個函式 operator，接著基於一個準則 criteria 來過濾元素： mf criteria operator list filter criteria map operator list 經過如下推導： mf x y z filter x map y z x y z filter x map y z x y z filter x map y z x y filter x map y x y filter x map y x y filter x map y x filter x map x map filter x x map filter x x map filter x map filter map filter mf 可以表達為無點樣式： mf map filter 串接式程式語言 在串接式程式語言和麵向堆疊程式語言中，無點方法也很常用。例如，計算斐波那契數的過程，在 Unix 的 dc 命令中可實現為： echo 7 dc e d1G sF d 1 lFx r 2 lFx sG lFx p 13 在 Factor 中可與其等價的實現為： fib n Fn dup 1 1 fib 2 fib bi when 在這兩個例子中，遞迴呼叫函式的引數在堆疊中而沒有被顯式的命名。 參見 組合子邏輯 串接式程式語言 函式級程式設計 註釋和引用 外部連結 From FunctionLevel Programming to Pointfree Style Pure Functions in APL and J How to use tacit programming in any APLlike language Closed applicative languages 1971 1976 ff in John W Backus Publications Category 程式設計典範