第一次接觸函數(shù)式是從學(xué)scheme(lisp的一種)開始。而我產(chǎn)生學(xué)lisp的興趣,是因?yàn)樽x了一篇名為《如何成為一名黑客》的譯文(原文《How To Become A Hacker》)瓦胎。最初認(rèn)為scheme是由一些奇奇怪怪的括號(hào)欠雌、運(yùn)算符組成淆游。不過隨著了解到的變多恃锉,才開始明白它編程范式的思想。不過后來不再繼續(xù)學(xué)lisp螃成。首先lisp實(shí)際應(yīng)用較少旦签,其次學(xué)習(xí)了它基本的范式思想并應(yīng)用已夠了。不過如果讓我去做理論研究寸宏,我可以考慮再深入學(xué)習(xí) = =宁炫。
圖書館見Oreilly的《函數(shù)式編程思維》,覺得封面一如既往的有趣氮凝,打開看看覺得不錯(cuò)羔巢。遂借回去看。這本書講解語言主要是jvm類的語言罩阵,如java8.
書中明確提出了 函數(shù)式編程的“三板斧”:
1 filter : 篩選竿秆,獲得數(shù)據(jù)集的特定子集
2 map : 映射,將集合稿壁、列表等轉(zhuǎn)換成新的集合幽钢、列表等
3 catamophism :這里它描述不是很清楚,我理解是對(duì)輸入的序列逐個(gè)操作(如累加)傅是,然后輸出一個(gè)結(jié)果匪燕。如python中的reduce()
講得很好蕾羊,個(gè)人感覺這“三板斧”是函數(shù)式編程的精髓之一。實(shí)際應(yīng)用中用得較多的也是這三板斧谎懦。函數(shù)式中還有些思想很優(yōu)秀肚豺,比如盡量避免使用狀態(tài)(狀態(tài)會(huì)導(dǎo)致副作用,避免使用狀態(tài)是函數(shù)式思想中強(qiáng)調(diào)執(zhí)行結(jié)果而非過程的表現(xiàn)之一)界拦、閉包、lazy evaluation梗劫。
lazy evaluation(惰性賦值)享甸,如當(dāng)一個(gè)變量被使用到才應(yīng)該被計(jì)算。過程式(如 C)可能在未使用時(shí)也需要先聲明梳侨。
簡(jiǎn)單舉個(gè)盡量避免中間狀態(tài)的例子
```python
def f1(a,b):
? ?c = 0
? ?c = a if a>b else b
? ?return c
def f2(a,b):
? ?return a if a>b else b
```
f2就未使用c這一中間狀態(tài)蛉威,函數(shù)更清晰明了。
總的說來走哺,個(gè)人認(rèn)為蚯嫌,函數(shù)式編程思想應(yīng)該取其精華去其糟粕。比如過分使用函數(shù)式會(huì)增添不必要的麻煩丙躏。像一句話說的那樣“我以為lisp是屠龍技择示,結(jié)果屠的卻是自己”。現(xiàn)在已不必糾結(jié)編程范式的選擇晒旅,因?yàn)楝F(xiàn)下多范式語言 不少栅盲,關(guān)鍵還是編程者要對(duì)語言進(jìn)行高效合理地駕馭。