自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何學(xué)會(huì)函數(shù)式編程

開(kāi)發(fā) 前端
本文是從 How to get started with functional programming 這篇文章翻譯而來(lái)。

上周末,有人問(wèn)我,如何學(xué)會(huì)函數(shù)式編程。我的回答是:用你現(xiàn)在使用的編程語(yǔ)言寫純正函數(shù)。

純函數(shù)唯一的輸入是它的參數(shù),唯一的輸出是它的返回值。如果你以前從未接觸過(guò)這個(gè)概念,你會(huì)以為所有的函數(shù)都是純正的。畢竟,所有的函數(shù)都是接受一個(gè)或多個(gè)輸入值,返回一個(gè)輸出值。但在某些傳統(tǒng)編程中,經(jīng)常會(huì)有一些外來(lái)的信息流入或流出函數(shù)。例如,一個(gè)不規(guī)范的函數(shù)有可能會(huì)依賴一個(gè)全局變量或一些類成員數(shù)據(jù)。在這種情況下,函數(shù)的行為并不完全決定于它的參數(shù)值。相似的,一個(gè)不規(guī)范的函數(shù)有可能會(huì)更改一個(gè)全局變量或修改數(shù)據(jù)庫(kù)。這種情況下,函數(shù)除了返回值外,還會(huì)附帶一些額外操作。

你可以用任何語(yǔ)言寫出純函數(shù),只是有些語(yǔ)言容易寫,有些語(yǔ)言寫起來(lái)比較復(fù)雜。例如,沒(méi)有人會(huì)把Fortran當(dāng)作一種函數(shù)式語(yǔ)言,但有些人(M. J. D. Powell)卻強(qiáng)制自己在Fortran里要寫純函數(shù)。

為什么要寫純函數(shù)?

純函數(shù)具有親系透徹性(referential transparency),也就是說(shuō),針對(duì)相同的輸入值,它一定給出相同的輸出值。函數(shù)輸出不依賴系統(tǒng)時(shí)間、數(shù)據(jù)庫(kù)狀態(tài)以及任何沒(méi)有顯式的作為參數(shù)傳入函數(shù)的東西。這也表明純函數(shù)易于理解(因此也易于調(diào)試和測(cè)試)。

你可以一直使用純函數(shù)。

但如果你想把一個(gè)值放到數(shù)據(jù)庫(kù)里,光通過(guò)純函數(shù)是實(shí)現(xiàn)不了的?;蛘弋?dāng)你想調(diào)用一個(gè)隨機(jī)數(shù)發(fā)生器時(shí),你可不想它保持親系透徹性 —— 每次都返回相同的值。但是,在可以用到純函數(shù)的時(shí)候,你應(yīng)該使用純函數(shù),用純函數(shù)來(lái)消除越界聯(lián)系。完全的純函數(shù)程序是不現(xiàn)實(shí)的;有人建議說(shuō)***的純度系數(shù)應(yīng)該是 85%。

那么,為什么程序員不大量的使用純函數(shù)呢?

一個(gè)原因是,純函數(shù)需要更長(zhǎng)的參數(shù)表。在面向?qū)ο蟮木幊陶Z(yǔ)言里,對(duì)象可以隱式的依賴對(duì)象狀態(tài)來(lái)減少參數(shù)數(shù)量。對(duì)于這更簡(jiǎn)潔的方法接口,你付出的代價(jià)是,你無(wú)法只通過(guò)方法本身來(lái)理解這個(gè)方法。調(diào)用這個(gè)方法時(shí)你還需要知道對(duì)象的狀態(tài)。為了獲得更短的方法接口而放棄親系透徹性值不值得?這依賴于你的上下文環(huán)境和你的風(fēng)格,按我的觀點(diǎn),我更愿意用更長(zhǎng)的函數(shù)接口來(lái)?yè)Q取更純的函數(shù)。

另外一個(gè)人們不太喜歡使用純函數(shù)的原因是,把大型數(shù)據(jù)結(jié)構(gòu)傳入函數(shù)太麻煩。但這也依賴于你怎么干。你可以只是形式上的把一個(gè)對(duì)象傳輸給函數(shù),而不是把整個(gè)對(duì)象按字節(jié)拷貝進(jìn)去。

為了效率,你也可以制造一些假純度。例如,Mike Swaim最近在一個(gè)評(píng)論里給出了一個(gè)如何利用Memoization讓程序的速度提升數(shù)個(gè)等級(jí)的例子。(Memoization是一種緩存技術(shù)。當(dāng)一個(gè)函數(shù)向系統(tǒng)請(qǐng)求計(jì)算某些東西時(shí),它首先看看這個(gè)東西是否已經(jīng)被緩存過(guò)。如果是,它會(huì)從從緩存里取出結(jié)果返回。如果否,它會(huì)計(jì)算它,然后把輸出放到緩存里。)使用Memoization技術(shù)的函數(shù)嚴(yán)格的說(shuō)不是純函數(shù) —— 它的計(jì)算操作直接受緩存狀態(tài)的影響 —— 但這樣的函數(shù)仍然保持親系透徹性,如果你給它相同的輸入,它總會(huì)產(chǎn)生相同的輸出。你可以認(rèn)為稱這樣的函數(shù)為純函數(shù)是一種欺騙,的確也是,但如果你總是糾結(jié)于這種事情,那你也知道,完全純函數(shù)是有副作用的。

原文:http://www.aqee.net/how-to-get-started-with-functional-programming/

【編輯推薦】

  1. JavaScript入門之基本函數(shù)
  2. 2011下半年Web編程語(yǔ)言和腳本語(yǔ)言的就業(yè)趨勢(shì)
  3. 學(xué)習(xí)不同編程語(yǔ)言的重要性
  4. 編程巨星成長(zhǎng)的唯一秘訣
  5. 每一門編程語(yǔ)言都是上輩子折翼的天使
責(zé)任編輯:陳貽新 來(lái)源: 外刊IT評(píng)論
相關(guān)推薦

2018-11-28 11:20:53

Python函數(shù)式編程編程語(yǔ)言

2020-09-22 11:00:11

Java技術(shù)開(kāi)發(fā)

2020-09-23 07:50:45

Java函數(shù)式編程

2021-09-30 11:12:00

函數(shù)式編程 Actor

2013-09-09 09:41:34

2011-03-08 15:47:32

函數(shù)式編程

2016-10-31 20:46:22

函數(shù)式編程Javascript

2020-09-24 10:57:12

編程函數(shù)式前端

2025-03-11 10:00:20

Golang編程函數(shù)

2023-12-14 15:31:43

函數(shù)式編程python編程

2022-09-22 08:19:26

WebFlux函數(shù)式編程

2017-06-08 14:25:46

Kotlin函數(shù)

2013-03-20 10:22:51

編程語(yǔ)言編程開(kāi)發(fā)語(yǔ)言

2010-11-25 09:06:37

Web開(kāi)發(fā)函數(shù)式編程

2010-03-11 10:34:22

Scala

2012-09-21 09:21:44

函數(shù)式編程函數(shù)式語(yǔ)言編程

2016-08-11 10:11:07

JavaScript函數(shù)編程

2016-08-11 10:34:37

Javascript函數(shù)編程

2012-08-21 09:20:37

函數(shù)式編程函數(shù)編程編程

2020-04-22 13:56:26

python函數(shù)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)