Swift函數(shù)柯里化介紹及使用場景

函數(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ù)式編程初探

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鱼冀,一起剝皮案震驚了整個濱河市报破,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌千绪,老刑警劉巖充易,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荸型,居然都是意外死亡盹靴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門瑞妇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稿静,“玉大人,你說我怎么就攤上這事辕狰「谋福” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵蔓倍,是天一觀的道長悬钳。 經(jīng)常有香客問我,道長偶翅,這世上最難降的妖魔是什么默勾? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮聚谁,結果婚禮上母剥,老公的妹妹穿的比我還像新娘。我一直安慰自己垦巴,他們只是感情好媳搪,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骤宣,像睡著了一般秦爆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憔披,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天等限,我揣著相機與錄音爸吮,去河邊找鬼。 笑死望门,一個胖子當著我的面吹牛形娇,可吹牛的內容都是我干的。 我是一名探鬼主播筹误,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桐早,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厨剪?” 一聲冷哼從身側響起哄酝,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祷膳,沒想到半個月后陶衅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡直晨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年搀军,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勇皇。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡罩句,死狀恐怖,靈堂內的尸體忽然破棺而出儒士,到底是詐尸還是另有隱情的止,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布着撩,位于F島的核電站,受9級特大地震影響匾委,放射性物質發(fā)生泄漏拖叙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一赂乐、第九天 我趴在偏房一處隱蔽的房頂上張望薯鳍。 院中可真熱鬧,春花似錦挨措、人聲如沸挖滤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斩松。三九已至,卻和暖如春觉既,著一層夾襖步出監(jiān)牢的瞬間惧盹,已是汗流浹背乳幸。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钧椰,地道東北人粹断。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像嫡霞,于是被迫代替她去往敵國和親瓶埋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容