柯里化

在計算機科學中，柯里化的函式，並且返回接受餘下的引數而且返回結果的新函式的技術。這個技術由克里斯托弗·斯特雷奇以邏輯學家哈斯凱爾·加里命名的，儘管它是Moses Schönfinkel和戈特洛布·弗雷格發明的。在直覺上，柯里化聲稱「如果你固定某些引數，你將得到接受餘下引數的一個函式」。所以對於有兩個變數的函式formula_1，如果固定了formula_2，則得到有一個變數的函式formula_3。在理論計算機科學中，柯里化提供了在簡單的理論模型中，比如：只接受一個單一引數的lambda演算中，研究帶有多個引數的函式的方式。函式柯里化的對偶是Uncurrying，一種使用匿名單引數函式來實現多引數函式的方法。例如：var foo = function(a) {return function(b) {return a * a + b * b;這樣呼叫上述函式：codice_1，或直接codice_2。動機.柯里化是一種處理函式中附有多個引數的方法，並在只允許單一引數的框架中使用這些函式。例如，一些分析技術只能用於具有單一引數的函式。現實中的函式往往有更多的引數。弗雷格表明，為單一引數情況提供解決方案已經足夠了，因為可以將具有多個引數的函式轉換為一個單引數的函式鏈。這種轉變是現在被稱為“柯里化”的過程。在數學分析或計算機程式設計中，所有可能遇到的“普通”函式都可以被使用。但是，有些類別不可能使用柯里化；確實允許柯里化的最普通的類別是閉合的monoidal類別。一些程式語言幾乎總是使用curried函式來實現多個引數；值得注意的例子是 ML 和 Haskell，在這兩種情況下，所有函式都只有一個引數。這個屬性是從lambda演算繼承而來的，其中多引數的函式通常以柯里形式表示。柯里化與部份求值是相關的，但不完全相同。在實作中，閉包的程式設計技術可以用來執行部份求值和一種捲曲，透過將引數隱藏在使用柯里化函式的環境中。部份求值.柯里化有如倣效接受多個引數的函式評估過程，若以紙筆手工作業，要週密地寫出評估過程中的所有步驟。例如，給定某一函式 formula_4:要評估 formula_5 時，首先以 formula_6代入 formula_7因為結果會是函式 formula_8的輸出，所以可定義為一個新函式 formula_9 為 formula_10接下來將 formula_8引數以 formula_12替換，產生了 formula_13在紙上使用傳統符號，上述過程通常是一次代入兩個引數 formula_14的值就完成了。而每個引數其實是依次序替換，在每一步替換的中介函式只能接受單一個引數。以上範例有點缺陷，雖然應用上類似函式的部份求值。對柯里化的過程來說，但並非完全相同。示例.柯里化是產生一系列連鎖函式的一種方法，其中每個函式只有一個引數。藉由另一個柯里化之後的新函式，傳回其它剩餘引數的功能，將原本以多個引數應用的函式“隱藏”起來，如下所述。給定帶有 "x"和"y"兩個引數的函式 "f"，也就是，formula_15然後可以構造一個與原來的 "f" 相關的新函式 "h"x。這個函式的形式只有單一引數 "y"，並給定該引數，則 "h"x 返回 "f"("x","y")。也就是，formula_16.在這裡應該瞭解 "h"上的下標 "x"是當成隱藏作用的符號設施，或者說把一個引數放在一邊，使原函式變成只帶一個引數。柯里化提供了符號標記上的技巧，將函式因而抽象化。這個技巧要利用map或函式構造子。符號 formula_17用於表示抽象化的實際行為。例如以 formula_18 這樣子來表示：某個函式將一個引數 "y"對映到結果 "z"。然後考慮從 "h""x" 記號中刪掉下標 "x"，就得到了一個 柯里化表示的代表符 "h"；而成為另一個給予 "x" 能把其“值”傳回的不同函式 "h"x；它恰好是一個函式構造，其對映過程可以用 formula_19 語句來表達，或者描述為一個將引數 "y"對映到結果 "z"的函式。也就是，formula_20,用不同代表符號來看，formula_21函式 "h" 本身現在可用 "h"x 相似的表示，並寫成formula_22能夠負責並處理對開頭"涉及"的函式引數。鑑於上述情況，柯里化的行為可被理解為一函式，給予某些任意的 "f"，即涉及相關的 "h"函式可以產生 "h"的所述功能；論及 "f"。也就是，formula_23或相當於formula_24這說明瞭柯里化的基本性質：它是引數重新定位的機制，將原函式中的每一個引數繫結到不同的新函式，而返回另一個相關的函式。也就是給定函式 "f"原本傳回一個“值”，則柯里化“構造”了一個新函式 "h" 而傳回的是涉及 "f"的函式。另一種理解柯里化的不同方式，則意識到它只是一個代數遊戲，符號的句法重新排列。人們不會問這些符號的“含義”是什麼; 一個人只同意他們的重新排列規則。 要看出這一點，注意原來的函式 "f"本身可能寫成formula_25與上面的函式 "h"互相比較，可以看出這兩種形式都重新排列了括號，以及將逗號轉換為箭頭。回到前面的例子，formula_26然後有，formula_27作為上例柯里化的相等物。 新增一個引數到 "g" 然後給出formula_28以及formula_29剝除引數的方法或許更容易地理解，例如有四個引數的函式：formula_30經過上述操作，匯出為形式formula_31這應用到三元組之上可得到formula_32.然後適當地寫成柯里化形式formula_33一直繼續玩著重新安排符號的代數遊戲，最終導出了完全的柯里化形式formula_34對箭頭運算子一般理解是右結合的，所以上面大部份的括號是多餘的，在意義不變的情況下可以刪除掉。因此，寫成了很常見的formula_35也就是函式 "f"完全的柯里化形式。定義.從非形式的一般定義開始，柯里化是最容易理解的，然後再塑造它以適應許多不同的領域。首先說明一些符號的標記法。formula_36 表示從 formula_37 對映到 formula_38 的函式formula_39。formula_40 表示從 formula_37 到 formula_38 的所有函式。這裡，formula_37 和 formula_38 可以是集合、或者是型別，或者它們可以是其它型別的物件，如下所述。令 formula_45表示有序對，即笛卡爾乘積。給定型別為formula_46 的函式formula_39，柯里化即構造或建立一個新的函式：formula_48也就是說，formula_49取一個型別為 formula_37的引數，並返回一個型別為 formula_51的函式。Uncurrying則相反。集合論.數理領域的集合論中，符號 formula_52用於表示從 formula_37集合對映到 formula_38集合的函式。柯里化是指從 formula_55對映到 formula_56的 formula_57函式，和從 formula_58之中對映，由 formula_59到formula_56的 formula_61函式，這些組合的自然變換。事實上是這種自然變換關係，闡述了出現在集合論中的指數符號。在集合的範疇論中 formula_52被稱為指數物件。函式空間.在函式空間理論中，如泛函分析或拓撲的同倫，人們通常對拓撲空間之間的連續函式感興趣。從 formula_37到 formula_38 "所有的"函式集，寫成 formula_65並使用 formula_52 來表示連續函式的子集。在這裡的 formula_67是一一對應的formula_68而 uncurrying 是反向的對映。如果從 formula_37到 formula_38 的 formula_52集合為連續函式給出了緊緻開拓撲緊緻開拓撲，而且如果 formula_38空間是區域性豪斯多夫緊緻的，那麼 formula_67是一個連續函式，也是同胚。儘管可能有更多情況，當 formula_37，formula_38和 formula_52 是緊生成的時候，情況都是相同的。這結果發展成了指數表示法formula_77有時稱為指數法則。 而有用的推論是，一個函式若且唯若其柯里化形式是連續時，它才是連續的。另一個重要的結果是應用程式對映。也就是說，formula_78當 formula_52是緊緻開放的，而且 formula_38區域性緊緻的豪斯多夫時，那上述式子是連續的。這兩個結果對於確立同倫的連續性非常重要，亦即當 formula_37是單位區間 formula_82，所以 formula_83能想成就是從 formula_38 到formula_85的兩個函式的同倫，或者等價地，是 formula_86中的單個路徑。域理論.在序理論對於偏序集合的格，當格是給定的 Scott拓撲時，則 formula_67會是一個連續函式。為了提供 lambda演算的語義學，要先研究 Scott連續函式。更一般地說，現在研究 Scott連續函式的域理論中，含括了計算機演算法的指稱語義學。請注意，Scott拓撲結構與拓撲空間範疇中可能遇到的許多常見拓撲結構完全不同; Scott拓撲通常更為精巧，而不是很嚴審的。連續性的概念使它出現在同倫型別理論中，粗略地說，兩個計算機程式可以被認為是同倫的，如果他們可以“連續”地從一個重構到另一個，即計算得出相同的結果。型別理論.在型別理論中，對於電腦科學型別系統的一般概念，被形式化為一個具體的代數型別。例如寫為 formula_36時，意指那個 formula_37和 formula_38是一種型別，而 formula_91 箭頭符號代表是型別建構函式，特別是指函式型別或箭頭型別。類似地，型別的笛卡爾積是由 formula_92建構函式，而建構出的複合結構型別。型別理論方法可以用 ML程式語言表達，而受啟發衍生出的語言有：CaML，Haskell和F＃。邏輯.在Curry-Howard下，柯里化和對偶柯里化的存在相當於邏輯定理formula_93，因為多元組對應於邏輯中的且連線，而函式型別對應於蘊涵。歷史.「科裡化」一詞由克里斯托弗·斯特雷奇創造，以邏輯學家哈斯凱爾·加里命名。另外一個名詞 "Schönfinkelisation" 則以Moses Schönfinkel命名。在數學歷史中，這個原理可以追溯到1893年戈特洛布·弗雷格的工作。