函數(shù)柯里化是函數(shù)式編程里的一個重要概念檀何。swift中的柯里化可能很多人都沒有了解過魁兼,今天給大家介紹一下柯里化的概念和一些使用場景。
定義
柯里化(Currying)是從數(shù)學里借用過來的編程語言技法(基于20世紀Haskell Curry等數(shù)學家的研究成果)拳氢《潮纾柯里化指的是從一個多參數(shù)函數(shù)變成一連串單參數(shù)函數(shù)的變換。它描述的是變換的過程触幼,不涉及變換之后對函數(shù)的調用硼瓣。調用者可以決定對多少個參數(shù)實施變換,余下的部分將衍生為一個參數(shù)數(shù)目較少的新函數(shù)置谦。這個新的函數(shù)接收剩下的參數(shù)堂鲤,其內部則指向原始函數(shù)。當提供的參數(shù)完整了才會最終執(zhí)行原始函數(shù)媒峡。
語法
<pre><code>
//普通函數(shù)定義
func mutiply(x:Int,y:Int)->Int{
return x*y
}
//柯里化形式
func mutiply(x:Int)(y:Int)->Int{
return x*y
}
</code></pre>
使用如下:
<pre><code>
let twice=mutiply(2)
let result=twice(y: 5) //result等于10
//如果直接在一行里調用就這樣寫
let result2=mutiply(2)(y: 6)
</code></pre>
例子里的twice的類型是一個閉包瘟栖,可以粗暴的理解為mutiply的兩個參數(shù)第一個參數(shù)x已經(jīng)有了個默認值2,twice的參數(shù)就是剩下的另一個參數(shù)y丝蹭。
兩個細節(jié)
- 只有一個參數(shù)慢宗,并且這個參數(shù)是該函數(shù)的第一個參數(shù)坪蚁。必須按照參數(shù)的定義順序來調用柯里化函數(shù)奔穿。
- 柯里化函數(shù)的函數(shù)體只會執(zhí)行一次,只會在調用完最后一個參數(shù)的時候執(zhí)行柯里化函數(shù)體
應用場景
-
函數(shù)工廠
想象下面向對象編程里的工廠方法敏晤。如果有一個工廠返回的是函數(shù)贱田,那就正適合柯里化了。
adder通過柯里化把第一個參數(shù)固定為1嘴脾,返回了一個+1的函數(shù)男摧。
-
隱含參數(shù)
當我們需要頻繁調用一個函數(shù),而每次參數(shù)的值都差不多的時候译打,可以運用柯里化來設置隱含參數(shù)耗拓。
我們有個連接數(shù)據(jù)庫的方法connectDB,參數(shù)是數(shù)據(jù)庫名稱和用戶奏司,這是一個通用的方法乔询。但是數(shù)據(jù)庫的環(huán)境只有測試和正式兩個環(huán)境,所以利用柯里化生成好連接兩個數(shù)據(jù)庫的方法韵洋,隱藏了數(shù)據(jù)庫名稱這個參數(shù)竿刁。
這里其實還可以更進一步,用狀態(tài)模式封裝connectDB搪缨,這樣外面不用關心當前的環(huán)境食拜。
要強調的一個思維的轉化是,函數(shù)式編程思想副编,思考的單位不再是對象负甸,而是函數(shù)。使用上的區(qū)別是,在某個方法里呻待,如果需要這樣一個函數(shù)煮盼,只需要一個聲明,外面?zhèn)鬟f進來带污。至于這個函數(shù)在哪個對象上實現(xiàn)的不需要關心僵控。和面向接口編程更配哦。
歡迎關注我的微博:@沒故事的卓同學
相關鏈接:
Swift中的函數(shù)柯里化(Function Currying)
Swift之柯里化函數(shù)
函數(shù)式編程初探