函數(shù)式編程

我們今天說(shuō)的Go中的函數(shù)式編程主要是體現(xiàn)在閉包上面的待诅,比如

func adder() func(int) int {
    sum := 0
    return func(v int) int {
        sum += v
        return sum
    }
}
func main() {
    a := adder()
    for i := 0; i < 10; i++ {
        fmt.Printf("0 + 1 + ... + %d = %d\n", i, a(i))
    }
}

我們首先對(duì)比兩個(gè)概念

函數(shù)式編程 vs 函數(shù)指針
  • 函數(shù)是一等公民:參數(shù),變量害淤,返回值都可以是函數(shù)(C++只有函數(shù)指針 Java的函數(shù)不能作為參數(shù))
  • 高階函數(shù)
  • 函數(shù)->閉包

那么什么是正統(tǒng)的函數(shù)式編程呢扇雕?

  • 不可變性:不能有狀態(tài),只有常量和函數(shù)
  • 函數(shù)只能有一個(gè)參數(shù)

Go不會(huì)在正統(tǒng)上大作文章的窥摄,??


bibao.png

上面這張圖呀洼裤,很清楚的表達(dá)了閉包的概念,自由變量就是外面函數(shù)的變量相當(dāng)于sum溪王。我們來(lái)看一下正統(tǒng)的函數(shù)式編程是怎么做的呢,我們這邊馬馬虎虎的實(shí)現(xiàn)一把V岛АS狻!吱瘩!

type iAdder func(int) (int, iAdder)

func adder2(base int) iAdder {
    return func(v int) (int, iAdder) {
        return base + v, adder2(base + v)
    }
}
func main() {
    //  // a := adder() is trivial and also works.
    a := adder2(0)
    for i := 0; i < 10; i++ {
        var s int
        s, a = a(i)
        fmt.Printf("0 + 1 + ... + %d = %d\n",
            i, s)
    }
}
// 這樣的寫法可能不是很好懂道伟,但是這種寫法沒(méi)有自由變量在里面,會(huì)更安全一些。
最后我們來(lái)看一下其他語(yǔ)言是怎么實(shí)現(xiàn)閉包的蜜徽。
Python實(shí)現(xiàn)的方式
def adder(value):
    sum = 10
    def sumAll(value):
        nonlocal sum
        sum = sum+value
        return sum
    return sumAll

if __name__ =='__main__':
    result = adder(sum)
    # 打印環(huán)境變量
    print(result.__closure__[0].cell_contents) 
    for x in range(10):
        print(result(x))

Python是原生支持閉包的祝懂,你可以使用closure查看閉包內(nèi)容

C++實(shí)現(xiàn)閉包的方式
auto adder(){
    auto sum = 0;
    return [=] (int value) mutable {
        sum += value;
        return sum;
    };
}
// c++ 11及以后:支持閉包,我沒(méi)有學(xué)過(guò)c++這里給大家貼出來(lái)拘鞋,只是讓大家感受一把Q馀睢!盆色!

ok, 怎么樣閉包掌握的怎么樣了呢??;彝堋!8舳恪摩梧!繼續(xù)加油吧!P怠=龈浮!下面還有函數(shù)式編程的干貨浑吟,敬請(qǐng)期待把s舷恕!B蛑谩7嗖凇!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忿项,一起剝皮案震驚了整個(gè)濱河市蓉冈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轩触,老刑警劉巖寞酿,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脱柱,居然都是意外死亡伐弹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門榨为,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惨好,“玉大人,你說(shuō)我怎么就攤上這事随闺∪沾ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵矩乐,是天一觀的道長(zhǎng)龄句。 經(jīng)常有香客問(wèn)我回论,道長(zhǎng),這世上最難降的妖魔是什么分歇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任傀蓉,我火速辦了婚禮,結(jié)果婚禮上职抡,老公的妹妹穿的比我還像新娘葬燎。我一直安慰自己,他們只是感情好繁调,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布萨蚕。 她就那樣靜靜地躺著,像睡著了一般蹄胰。 火紅的嫁衣襯著肌膚如雪岳遥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天裕寨,我揣著相機(jī)與錄音浩蓉,去河邊找鬼。 笑死宾袜,一個(gè)胖子當(dāng)著我的面吹牛捻艳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庆猫,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼认轨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了月培?” 一聲冷哼從身側(cè)響起嘁字,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杉畜,沒(méi)想到半個(gè)月后纪蜒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡此叠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纯续,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灭袁。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猬错,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茸歧,到底是詐尸還是另有隱情兔魂,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布举娩,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铜涉。R本人自食惡果不足惜智玻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芙代。 院中可真熱鬧吊奢,春花似錦、人聲如沸纹烹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铺呵。三九已至裹驰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間片挂,已是汗流浹背幻林。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留音念,地道東北人沪饺。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闷愤,于是被迫代替她去往敵國(guó)和親整葡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348