小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

不要用面向對象來迷惑程序員如何學會函數(shù)式編程

 rookie 2012-04-11
上周末,有人問我,如何學會函數(shù)式編程。我的回答是:用你現(xiàn)在使用的編程語言寫純正函數(shù)。

純函數(shù)唯一的輸入是它的參數(shù),唯一的輸出是它的返回值。如果你以前從未接觸過這個概念,你會以為所有的函數(shù)都是純正的。畢竟,所有的函數(shù)都是接受一個或多 個輸入值,返回一個輸出值。但在某些傳統(tǒng)編程中,經(jīng)常會有一些外來的信息流入或流出函數(shù)。例如,一個不規(guī)范的函數(shù)有可能會依賴一個全局變量或一些類成員數(shù) 據(jù)。在這種情況下,函數(shù)的行為并不完全決定于它的參數(shù)值。相似的,一個不規(guī)范的函數(shù)有可能會更改一個全局變量或修改數(shù)據(jù)庫。這種情況下,函數(shù)除了返回值 外,還會附帶一些額外操作。
你可以用任何語言寫出純函數(shù),只是有些語言容易寫,有些語言寫起來比較復雜。例如,沒有人會把Fortran當作一種函數(shù)式語言,但有些人(M. J. D. Powell)卻強制自己在Fortran里要寫純函數(shù)。
為什么要寫純函數(shù)?純函數(shù)具有親系透徹性(referential transparency),也就是說,針對相同的輸入值,它一定給出相同的輸出值。函數(shù)輸出不依賴系統(tǒng)時間、數(shù)據(jù)庫狀態(tài)以及任何沒有顯式的作為參數(shù)傳入函數(shù)的東西。這也表明純函數(shù)易于理解(因此也易于調試和測試)。
你可以一直使用純函數(shù)。但如果你想把一個值放到數(shù)據(jù)庫里,光通過純函數(shù)是實現(xiàn)不了的。或者當你想調用一個隨機數(shù)發(fā)生器時,你可不想它保持親系透徹性—每次 都返回相同的值。但是,在可以用到純函數(shù)的時候,你應該使用純函數(shù),用純函數(shù)來消除越界聯(lián)系。完全的純函數(shù)程序是不現(xiàn)實的;有人建議說最佳的純度系數(shù)應該 是 85% 。
那么,為什么程序員不大量的使用純函數(shù)呢?一個原因是,純函數(shù)需要更長的參數(shù)表。在面向對象的編程語言里,對象可以隱式的依賴對象狀態(tài)來減少參數(shù)數(shù)量。對 于這更簡潔的方法接口,你付出的代價是,你無法只通過方法本身來理解這個方法。調用這個方法時你還需要知道對象的狀態(tài)。為了獲得更短的方法接口而放棄親系 透徹性值不值得?這依賴于你的上下文環(huán)境和你的風格,按我的觀點,我更愿意用更長的函數(shù)接口來換取更純的函數(shù)。
另外一個人們不太喜歡使用純函數(shù)的原因是,把大型數(shù)據(jù)結構傳入函數(shù)太麻煩。但這也依賴于你怎么干。你可以只是形式上的把一個對象傳輸函數(shù),而不是把整個對象按字節(jié)拷貝進去。
為了效率,你也可以制造一些假純度。例如,Mike Swaim最近在一個評論里給出了一個如何利用Memoization讓程序的速度提升數(shù)個等級的例子。(Memoization是一種緩存技術。當一個 函數(shù)向系統(tǒng)請求計算某些東西時,它首先看看這個東西是否已經(jīng)被緩存過。如果是,它會從從緩存里取出結果返回。如果否,它會計算它,然后把輸出放到緩存 里。)使用Memoization技術的函數(shù)嚴格的說不是純函數(shù)—它的計算操作直接受緩存狀態(tài)的影響—但這樣的函數(shù)仍然保持親系透徹性,如果你給它相同的 輸入,它總會產(chǎn)生相同的輸出。你可以認為稱這樣的函數(shù)為純函數(shù)是一種欺騙,的確也是,但如果你總是糾結于這種事情,那你也知道,完全純函數(shù)是有副作用的。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多