【函數(shù)式】純函數(shù)與替代模型

純函數(shù)

一個函數(shù)在程序執(zhí)行的過程中除了根據(jù)輸入?yún)?shù)給出運算結(jié)果之外沒有其他的副作用影響遗座,我們可以把這類函數(shù)稱為“純函數(shù)”榴捡。純函數(shù)由于不依賴外部變量,使得給定函數(shù)輸入其返回結(jié)果永遠(yuǎn)不變衡载,比如整數(shù)的加法函數(shù)允乐,它接收兩個整數(shù)值并返回一個整數(shù)值,對于給定的兩個整數(shù)值茫因,它的返回值永遠(yuǎn)是相同的整數(shù)值蚪拦。

副作用

相對于非純函數(shù),它們帶有副作用冻押,這使得函數(shù)不僅簡單返回一個值驰贷,還做了其他事情:

  • 修改了一個變量
  • 直接修改了數(shù)據(jù)結(jié)構(gòu)
  • 設(shè)置了一個對象的成員
  • 拋出一個異常或以一個錯誤終止
  • 打印到終端或讀取用戶的輸入
  • 讀取或?qū)懭胍粋€文件
  • 在屏幕上繪畫

像是執(zhí)行IO洛巢、處理錯誤括袒、修改數(shù)據(jù)都屬于副作用,這些副作用可能導(dǎo)致我們編寫的程序難以測試稿茉,進而容易產(chǎn)生bug箱熬。遵循函數(shù)式編程規(guī)范可以使編程更加模塊化,由于純函數(shù)模塊化的特性狈邑,使得程序容易被測試城须、復(fù)用、并行化米苹、泛化以及推導(dǎo)糕伐,這也減少了產(chǎn)生bug的可能。

純函數(shù)的使用將數(shù)據(jù)的創(chuàng)建過程和處理過程分離蘸嘶,通過把副作用推導(dǎo)程序的外層良瞧,來轉(zhuǎn)換任何帶有副作用的函數(shù)陪汽。對于函數(shù)式程序員而言,程序的實現(xiàn)應(yīng)該有一個純的內(nèi)核和一層很薄的外圍來處理副作用褥蚯。

引用透明

引用透明(referential transparency)的概念對純函數(shù)進行形式化挚冤,符合引用透明的表達式都可以由它的結(jié)果所取代,而不改變該程序的含義赞庶。當(dāng)調(diào)用一個函數(shù)時所傳入的參數(shù)是引用透明的训挡,冰鞋函數(shù)調(diào)用也是引用透明的,那么這個函數(shù)式一個純函數(shù)歧强。當(dāng)傳入函數(shù)的參數(shù)也是一個純函數(shù)時澜薄,使得高階函數(shù)的組合也是引用透明的,這有利于構(gòu)建更加復(fù)雜的邏輯摊册,而本身程序的計算結(jié)果是可以進行推斷的肤京,不用擔(dān)心環(huán)境對程序的影響。

對于程序p茅特,如果它包含的表達式e滿足引用透明忘分,所有的e都可以替換為它的運算結(jié)果而不會改變程序p的含義。假設(shè)存在一個函數(shù)f白修,若變大時f(x)對所有引用透明的表達式x也是引用透明的饭庞,那么這個f是一個純函數(shù)。

替代模型

引用透明要求函數(shù)不論進行了任何操作都可以用它的返回值來代替熬荆。這種限制使得推導(dǎo)一個程序的求值變得簡單而自然舟山,稱之為替代模型(substitution model)。如果表達式是引用透明的卤恳,可以想象計算過程就像在解代數(shù)方程累盗。展開表達式的每一部分,使用指示對象替代變量突琳,然后歸約到最簡單的形式若债。在這一過程中,每項都被等價值所替代拆融,計算的過程就是一個又一個等價值所替代的過程蠢琳。換句話說,引用透明使得程序具備了等式推理的能力镜豹。

替代模型更容易推理傲须,因為對運算的影響純粹是局部的(只對那些賦值表達式產(chǎn)生影響),不需要先在內(nèi)心模擬一系列狀態(tài)的更新才理解這一段代碼趟脂。只需要理解局部的推理泰讽,不必費心地去跟蹤函數(shù)執(zhí)行前后的狀態(tài)變化,只用簡單看一下函數(shù)的定義,把它替換成一個參數(shù)已卸。

小結(jié)

這一小節(jié)佛玄,我們了解了純函數(shù)的一些基本概念和其帶來的好處。我們知道累澡,純函數(shù)時模塊化的梦抢、可組合的,因為它從“對結(jié)果做什么”和“如果獲取輸入”中分離了計算本身的邏輯愧哟,就像一個黑盒子奥吩。對輸入的獲取只有一種方式:通過參數(shù)傳給函數(shù)。輸出也只是簡單地將計算結(jié)果返回翅雏。把這些關(guān)注點分離開,計算也更容易被復(fù)用人芽。我們可以復(fù)用這些邏輯望几,而不必?fù)?dān)心輸入或輸出對整個上下文引起的副作用。

轉(zhuǎn)載請注明作者Jason Ding及其出處
jasonding.top
Github博客主頁(http://blog.jasonding.top/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進入我的博客主頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萤厅,一起剝皮案震驚了整個濱河市橄抹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惕味,老刑警劉巖楼誓,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異名挥,居然都是意外死亡疟羹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門禀倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榄融,“玉大人,你說我怎么就攤上這事救湖±⒈” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵鞋既,是天一觀的道長力九。 經(jīng)常有香客問我,道長邑闺,這世上最難降的妖魔是什么跌前? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮陡舅,結(jié)果婚禮上舒萎,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好臂寝,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布章鲤。 她就那樣靜靜地躺著,像睡著了一般咆贬。 火紅的嫁衣襯著肌膚如雪败徊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天掏缎,我揣著相機與錄音皱蹦,去河邊找鬼。 笑死眷蜈,一個胖子當(dāng)著我的面吹牛沪哺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酌儒,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辜妓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忌怎?” 一聲冷哼從身側(cè)響起籍滴,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榴啸,沒想到半個月后孽惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鸥印,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年勋功,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库说。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡酝润,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璃弄,到底是詐尸還是另有隱情要销,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布夏块,位于F島的核電站疏咐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脐供。R本人自食惡果不足惜浑塞,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望政己。 院中可真熱鬧酌壕,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糊昙,卻和暖如春辛掠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背释牺。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工萝衩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人没咙。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓猩谊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祭刚。 傳聞我的和親對象是個殘疾皇子牌捷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券袁梗,享受所有官網(wǎng)優(yōu)惠宜鸯,并抽取幸運大獎:點擊這里領(lǐng)取 在...
    HetfieldJoe閱讀 573評論 1 1
  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù)憔古,函數(shù)就是值遮怜。所有函數(shù)都消費函數(shù),...
    JackChen1024閱讀 5,978評論 1 17
  • 前言 我不知道你都收藏了些什么鸿市,我的閱讀清單里面相當(dāng)大部分都是函數(shù)式編程相關(guān)的東東:基本上是最難啃的锯梁。這些文章充斥...
    北斗星晨閱讀 2,477評論 2 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)焰情,斷路器陌凳,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 文/朱俊丞 春天邁著輕快的舞步,走過了我們小區(qū)的假山内舟;而山上的花兒也爭先恐后地綻放著笑臉合敦,迎接著美麗的春天。 爬上...
    王了一一閱讀 317評論 4 7