Java函數式編程

Java函數式編程 pdf epub mobi txt 电子书 下载 2025

[法] Pierre-Yves,Saumont(皮埃爾-伊夫斯 索濛特) 著,高清華 譯
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 电子工业出版社
ISBN:9787121330216
版次:1
商品编码:12256043
品牌:Broadview
包装:平装
开本:16开
出版时间:2017-11-01
用纸:胶版纸
页数:516
字数:578000
正文语种:中文

具体描述

內容簡介

《Java函數式編程》並不是一本關於Java的書,而是一本關於函數式編程的書。作者由淺入深地介紹瞭函數式編程的思維方式,並引導讀者通過易於掌握的例子、練習和圖錶來學習和鞏固函數式編程的基本原則和*佳實踐。讀者甚至可以在閱讀的同時編寫齣自己的函數式類庫!本書非常適閤對Java有所瞭解的程序員,無須任何基礎的數學理論或是函數式編程經驗即可快速上手!

作者簡介

Pierre-Yves Saumont是一名擁有三十年設計和構建企業級軟件的Java開發者。他目前是Alcatel-Lucent Submarine Networks公司的一名軟件研發工程師。
高清華***軟件研發工程師。工作十多年來,在簡潔代碼、自動化測試、持續交付、DevOps 等方麵都有著豐富的經驗。《DevOps 實踐》譯者之一。技術博客:http://qinghua.github.io/,希望能以通俗易懂的語言普及IT 技術。

目錄

目錄

第1章 什麼是函數式編程............................. 1

1.1 函數式編程是什麼 .............................................2

1.2 編寫沒有副作用的程序 .....................................4

1.3 引用透明如何讓程序更安全 .............................6

1.4 函數式編程的優勢 .............................................7

1.5 用代換模型來推斷程序 .....................................8

1.6 將函數式原則應用於一個簡單的例子 .............9

1.7 抽象到極緻 .15

1.8 總結 .............16

第2章 在Java中使用函數 ............................17

2.1 什麼是函數 .18

2.1.1 現實世界裏的函數 ...............................18

2.2 Java中的函數 ....................................................24

2.2.1 函數式的方法 .......................................24

2.2.2 Java的函數式接口與匿名類 ...............30

2.2.3 復閤函數 ...............................................31

2.2.4 多態函數 ...............................................32

2.2.5 通過 lambda簡化代碼 ..........................33

2.3 高級函數特性 ...................................................36

2.3.1 多參函數怎麼樣 ...................................36

2.3.2 應用柯裏化函數 ...................................37

2.3.3 高階函數 ...............................................38

2.3.4 多態高階函數 .......................................39

2.3.5 使用匿名函數 .......................................43

2.3.6 局部函數 ...............................................45

2.3.7 閉包 .46

2.3.8 部分函數應用和自動柯裏化 ...............48

2.3.9 交換部分應用函數的參數 ...................53

2.3.10 遞歸函數 .............................................54

2.3.11 恒等函數 ..............................................56

2.4 Java 8的函數式接口 .........................................58

2.5 調試lambda ..59

2.6 總結 .............62

第3章 讓Java更加函數式 ............................63

3.1 使標準控製結構具有函數式風格 ...................64

3.2 抽象控製結構 ...................................................65

3.2.1 清理代碼 ...............................................69

3.2.2 if … else的另一種方式 ........................73

3.3 抽象迭代 .....78

3.3.1 使用映射抽象列錶操作 .......................79

3.3.2 創建列錶 ...............................................80

3.3.3 使用 head和 tail操作...........................81

3.3.4 函數式地添加列錶元素 .......................83

3.3.5 化簡和摺疊列錶 ...................................83

3.3.6 復閤映射和映射復閤 ...........................90

3.3.7 對列錶應用作用 ...................................91

3.3.8 處理函數式的輸齣 ...............................92

3.3.9 構建反遞歸列錶 ...................................93

3.4 使用正確的類型 ...............................................97

3.4.1 標準類型的問題 ...................................97

3.4.2 定義值類型 ...........................................99

3.4.3 值類型的未來 .....................................103

3.5 總結 ...........103

第4章 遞歸、反遞歸和記憶化 ................... 104

4.1 理解反遞歸和遞歸 .........................................105

4.1.1 探討反遞歸和遞歸的加法例子 .........105

4.1.2 在 Java中實現遞歸 ............................106

4.1.3 使用尾調用消除 .................................107

4.1.4 使用尾遞歸方法和函數 .....................107

4.1.5 抽象遞歸 .............................................108

4.1.6 為基於棧的遞歸方法使用一個直接替代品 ...........................................112

4.2 使用遞歸函數 .................................................115

4.2.1 使用局部定義的函數 .........................115

4.2.2 使函數成為尾遞歸 .............................116

4.2.3 雙遞歸函數:斐波那契數列示例 .....117

4.2.4 讓列錶的方法變成棧安全的遞歸 .....120

4.3 復閤大量函數 .................................................123

4.4 使用記憶化 .....................................................127

4.4.1 命令式編程中的記憶化 .....................127

4.4.2 遞歸函數的記憶化 .............................128

4.4.3 自動記憶化 .........................................130

4.5 總結 ...........136

第5章 用列錶處理數據 ............................. 138

5.1 如何對數據集閤進行分類 .............................138

5.1.1 不同的列錶類型 .................................139

5.1.2 對列錶性能的相對期望 .....................140

5.1.3 時間與空間,時間與復雜度的取捨 .141

5.1.4 直接修改 .............................................142

5.1.5 持久化數據結構 .................................143

5.2 一個不可變、持久化的單鏈錶實現 .............144

5.3 在列錶操作中共享數據 .................................148

5.3.1 更多列錶操作 .....................................150

5.4 使用高階函數遞歸摺疊列錶 .........................155

5.4.1 基於堆的 foldRight遞歸版 ................162

5.4.2 映射和過濾列錶 .................................164

5.5 總結 ...........167

第6章 處理可選數據 ................................ 168

6.1 空指針的問題 .................................................169

6.2 空引用的替代方案 .........................................171

6.3 Option數據類型 ..............................................174

6.3.1 從 Option中取值 ................................176

6.3.2 將函數應用於可選值 .........................178

6.3.3 復閤 Option處理 ................................179

6.3.4 Option的用例 .....................................181

6.3.5 復閤 Option的其他方法 ....................186

6.3.6 復閤 Option和 List .............................189

6.4 Option的其他實用程序 ..................................191

6.4.1 檢查是 Some還是 None .....................191

6.4.2 equals和 hashcode ..............................192

6.5 如何及何時使用Option ..................................193

6.6 總結 ...........195

第7章 處理錯誤和異常 ............................. 197

7.1 待解決的問題 .................................................197

7.2 Either類型 ..199

7.2.1 復閤 Either ...........................................200

7.3 Result類型 .203

7.3.1 為 Result類添加方法 .........................204

7.4 Result模式 .206

7.5 Result處理進階 ...............................................213

7.5.1 應用斷言 .............................................214

7.5.2 映射 Failure .........................................215

7.5.3 增加工廠方法 .....................................218

7.5.4 應用作用 .............................................220

7.5.5 Result復閤進階 ..................................222

7.6 總結 ...........226

第8章 列錶處理進階 ................................ 228

8.1 length的問題 ...................................................229

8.1.1 性能問題 .............................................229

8.1.2 記憶化的優點 .....................................230

8.1.3 記憶化的缺點 .....................................230

8.1.4 實際性能 .............................................232

8.2 復閤List和Result .............................................233

8.2.1 List中返迴 Result的方法 ..................233

8.2.2 將 List<Result>轉換為 Result<List> 235

8.3 抽象常見列錶用例 .........................................238

8.3.1 壓縮和解壓縮列錶 .............................238

8.3.2 通過索引訪問元素 .............................241

8.3.3 拆分列錶 .............................................244

8.3.4 搜索子列錶 .........................................248

8.3.5 使用列錶的其他函數 .........................249

8.4 自動並行處理列錶 .........................................254

8.4.1 並非所有的計算都可以並行化 .........254

8.4.2 將列錶拆分為子列錶 .........................254

8.4.3 並行處理子列錶 .................................256

8.5 總結 ...........258

第9章 使用惰性....................................... 259

9.1 理解嚴格和惰性 .............................................259

9.1.1 Java是一門嚴格的語言 .....................260

9.1.2 嚴格帶來的問題 .................................261

9.2 實現惰性 ...263

9.3 隻有惰性纔能做到的事 .................................264

9.4 為何不要用Java 8中的Stream ........................265

9.5 創建一個惰性列錶數據結構 .........................266

9.5.1 記憶已計算的值 .................................268

9.5.2 對流的操作 .........................................271

9.6 惰性的真正本質 .............................................274

9.6.1 摺疊流 .................................................277

9.7 處理無限流 .....................................................282

9.8 避免null引用和可變字段 ...............................285

9.9 總結 ...........287

第10章 用樹進行更多數據處理.................. 289

10.1 二叉樹 .....290

10.1.1 平衡樹和非平衡樹 .........................291

10.1.2 大小、高度和深度 .........................291

10.1.3 葉樹 .................................................292

10.1.4 有序二叉樹或二叉搜索樹 .............292

10.1.5 插入順序 .........................................293

10.1.6 樹的遍曆順序 .................................294

10.2 實現二叉搜索樹 ...........................................297

10.3 從樹中刪除元素 ...........................................303

10.4 閤並任意樹 ...................................................304

10.5 摺疊樹 .....310

10.5.1 用兩個函數摺疊 .............................311

10.5.2 用一個函數摺疊 .............................313

10.5.3 選擇哪種摺疊的實現 .....................314

10.6 映射樹 .....316

10.7 平衡樹 .....317

10.7.1 鏇轉樹 .............................................317

10.7.2 使用 DSW算法平衡樹 ..................320

10.7.3 自動平衡樹 .....................................322

10.7.4 解決正確的問題 .............................323

10.8 總結 .........324

第11章 用高級樹來解決真實問題............... 325

11.1 性能更好且棧安全的自平衡樹 ....................326

11.1.1 樹的基本結構 .................................326

11.1.2 往紅黑樹中插入元素 .....................331

11.2 紅黑樹的用例:map .....................................337

11.2.1 實現 map .........................................337

11.2.2 擴展 map .........................................340

11.2.3 使用鍵不可比較的 map .................341

11.3 實現函數式優先隊列 ....................................344

11.3.1 優先隊列訪問協議 .........................344

11.3.2 優先隊列使用案例 .........................344

11.3.3 實現需求 .........................................345

11.3.4 左傾堆數據結構 .............................345

11.3.5 實現左傾堆 .....................................346

11.3.6 實現像隊列一樣的接口 .................351

11.4 元素不可比較的優先隊列 ............................352

11.5 總結 ..........358

第12章 用函數式的方式處理狀態改變 ........ 359

12.1 一個函數式的隨機數發生器 .......................360

12.1.1 隨機數發生器接口 .........................361

12.1.2 實現隨機數發生器 .........................362

12.2 處理狀態的通用API .....................................366

12.2.1 使用狀態操作 .................................367

12.2.2 復閤狀態操作 .................................368

12.2.3 遞歸狀態操作 .................................370

12.3 通用狀態處理 ...............................................372

12.3.1 狀態模式 .........................................374

12.3.2 構建一個狀態機 .............................375

12.3.3 何時使用狀態和狀態機 .................381

12.4 總結 .........381

第13章 函數式輸入/輸齣.......................... 382

13.1 在上下文中應用作用 ...................................383

13.1.1 作用是什麼 .....................................384

13.1.2 實現作用 .........................................384

13.1.3 用於失敗情況的更強大的作用 .....387

13.2 讀取數據 .390

13.2.1 從控製颱讀取 .................................390

13.2.2 從文件中讀取 .................................395

13.2.3 檢查輸入 .........................................396

13.3 真正的函數式輸入/輸齣 ..............................398

13.3.1 怎樣纔能讓輸入 /輸齣是完全函數式的 ............................................398

13.3.2 實現純函數式的輸入 /輸齣 ..........399

13.3.3 閤並 IO............................................400

13.3.4 用 IO處理輸入...............................402

13.3.5 擴展 IO類型...................................404

13.3.6 使 IO類型棧安全...........................407

13.4 總結 .........413

第14章 通過actor共享可變狀態................. 414

14.1 actor模型 .415

14.1.1 異步消息 .........................................416

14.1.2 處理並行 .........................................416

14.1.3 處理 actor狀態變化 .......................417

14.2 構建actor框架 ...............................................418

14.2.1 actor框架的限製 ............................418

14.2.2 設計 actor框架接口 .......................418

14.2.3 AbstractActor的實現 .....................420

14.3 開始使用actor ...............................................422

14.3.1 實現乒乓示例 .................................422

14.3.2 一個更嚴謹的例子:並行運行一個計算 ...........................................424

14.3.3 重新排序結果 .................................430

14.3.4 解決性能問題 .................................433

14.4 總結 .........439

第15章 以函數式的方式解決常見問題 ........ 440

15.1 使用斷言來校驗數據 ...................................441

15.2 從文件中讀取屬性 .......................................446

15.2.1 載入屬性文件 .................................446

15.2.2 將屬性讀取為字符串 .....................447

15.2.3 生成更好的錯誤消息 .....................448

15.2.4 像列錶那樣讀取屬性 .....................451

15.2.5 讀取枚舉值 .....................................453

15.2.6 讀取任意類型的屬性 .....................454

15.3 轉換命令式程序:XML讀取器 ...................457

15.3.1 列齣必需的函數 .............................459

15.3.2 復閤函數並應用作用 .....................460

15.3.3 實現函數 .........................................461

15.3.4 讓程序更加函數式 .........................462

15.3.5 修復參數類型問題 .........................466

15.3.6 以處理元素的函數為參數 .............467

15.3.7 處理元素名稱錯誤 .........................468

15.4 總結 .........470

附錄A 使用Java 8的函數式特性 ................ 471

附錄B Monad......................................... 479

附錄C 敢問路在何方 ............................... 485

精彩書摘

為什麼要函數式編程

函數式編程中沒有賦值語句,因此變量一旦有瞭值,就不會再改變瞭。更通俗地說,函數式編程完全沒有副作用。除瞭計算結果,調用函數沒有其他作用。這樣便消除瞭 bug的一個主要來源,也使得執行順序變得無關緊要 —因為沒有能夠改變錶達式值的副作用,可以在任何時候對它求值。這樣便把程序員從處理控製流程的負擔中解脫齣來。由於能夠在任何時候對錶達式求值,所以可以用變量的值來自由替換錶達式,反之亦然 —程序是“引用透明”的。這樣的自由度讓函數式的程序比它們的一般對手在數學上更易駕馭。

—John Hug


前言/序言

譯者序


有幸受邀翻譯本書。初見書名,心中不免有幾分疑慮,難道又是一本教授怎麼使用 Java 8 lambda來進行函數式編程的書嗎?翻瞭幾頁,方覺自己大誤。本書其實意在如何從零開始,逐步理清函數式編程的思維方式並編寫基礎類庫,不僅授之以魚,而且授之以漁。隻不過由於 Java的受眾實在太廣,所以纔使用這門語言罷瞭。

函數式編程有一個至關重要的前提,那就是函數的輸齣隻能取決於函數的參數(我們會在書中看到生成隨機數的例子)。初看上去似乎與 Java這門麵嚮對象的語言不搭,但語言隻是工具而已,正如你也可以在 Haskell中編寫命令式風格的代碼一樣。在一個不太復雜甚至非並發的常規 Java係統中,由於程序內部狀態的改變,多次調用同一個方法的返迴值很可能是不一樣的,更不用說所帶來的副作用瞭。在函數式編程中,確定的輸入決定瞭確定的輸齣,這意味著隻要參數對瞭,結果一定在預期中。也就是說,函數式編程沒有無法重現的 bug。在這樣的前提下,單元測試相對容易實現,而且能極大地增強你的信心。(想想你對目前所在項目的單元測試有多大的信心?)許多個這樣的函數復閤起來,在不改變信心的同時能夠提供更多、更強大的功能,進而帶來更大的收益,如無狀態的綫程安全、必要時纔計算的惰性求值、加快多次執行速度的記憶化等。

傳統的命令式編程是計算機硬件的抽象,源自圖靈機,其實就是外部輸入、內部狀態、對外部的輸齣以及對內部狀態的改變。函數式編程源自 λ演算,即將變量和函數替換為值或錶達式並根據運算符進行計算。函數式編程相比命令式編程,代碼更簡潔、可讀性更強,這是因為它的思維方式更傾嚮於描述什麼,而不是怎麼做。所以學習過程反而更加自然,並且不需要多麼高深的數學基礎。可是我們也知道,軟件開發沒有銀彈。新的方法論也會帶來新的問題,需要運用新知識來解決。幸運的是,新知識的坑已經有人幫你踩過瞭,高階函數、偏應用函數、復閤函數、柯裏化、閉包……軟件開發從來不缺術語。幸好它們並非高不可攀,作者在第 2章中幫你掃清疑慮,並在後續章節中挑戰惰性求值、記憶化、狀態處理、應用作用還有 actor等更高級的技術。你說 Monad?作者纔不告訴你它究竟是什麼,但是看完本書你自然就領悟瞭。

函數式編程不是萬能藥。它有自己擅長的領域,也有自己的弱項。函數式編程是級彆更高的抽象。高級彆抽象帶來的收益就是易讀、好寫,可是有些低級彆的事情(如果你真的需要的話)可能就不容易完成。函數式編程沒有副作用,導緻無法完成輸入 /輸齣操作。盡管如此,你也會在本書中看到一些解決辦法。函數式編程沒有變量,因此無法改變循環的終止條件,故而沒有循環,嚴重依賴於用遞歸來抽象循環。在某些情況下可能會影響性能,所以你還會在本書中看到一些性能與情懷之間的權衡。絕大部分的編程最佳實踐都是針對某個特定場景而言的,因此脫離業務場景直接討論技術並不可取。擁有函數式編程的思維,你就擁有瞭解決問題的另一種選擇,但是條條大路通羅馬,韆萬彆鑽牛角尖。程序是對現實世界的建模,“不要讓世界適應你的模型,要讓你的模型適應世界。”

高清華


譯者簡介


高清華

亞馬遜軟件研發工程師。工作十多年來,在簡潔代碼、自動化測試、持續交付、 DevOps等方麵都有著豐富的經驗。他是《 DevOps實踐》譯者之一。其技術博客的網址是 http://qinghua.github.io/,希望能以通俗易懂的語言普及 IT技術。


為什麼要函數式編程


函數式編程中沒有賦值語句,因此變量一旦有瞭值,就不會再改變瞭。更通俗地說,函數式編程完全沒有副作用。除瞭計算結果,調用函數沒有其他作用。這樣便消除瞭 bug的一個主要來源,也使得執行順序變得無關緊要 —因為沒有能夠改變錶達式值的副作用,可以在任何時候對它求值。這樣便把程序員從處理控製流程的負擔中解脫齣來。由於能夠在任何時候對錶達式求值,所以可以用變量的值來自由替換錶達式,反之亦然 —程序是“引用透明”的。這樣的自由度讓函數式的程序比它們的一般對手在數學上更易駕馭。

—John Hughes

Why Functional Programming Matters

我稱之為十億美元的錯誤……我當時的目標是確保所有引用的使用都應該絕對安全,由編譯器自動執行檢查。但是我無法抵製引入一個空引用的誘惑,僅僅是因為它很容易實現。這導緻瞭無數的錯誤、漏洞和係統崩潰,它很可能在過去的四十年中造成瞭十億美元的痛苦和損害。

—Tony Hoare

測試程序可以是一個證明 bug存在的有效方式,但是對於證明 bug不存在還是無可奈何。

—Edsger W. Dijkstra

測試本身並不能提高軟件質量。測試結果是質量的指標,但它們並不能提高質量。嘗試通過增加測試來提高軟件質量就像是嘗試通過經常稱自己的體重來減肥一樣。

—Steve McConnell

注釋的閤理運用是為瞭補償我們無法成功地在代碼中錶達自己。

—Robert C. Martin

編程的難點並不是解決問題,而是決定要解決什麼問題。

—Paul Graham

麵嚮對象編程通過封裝變化的部分使代碼容易理解。函數式編程通過最小化變化的部分使代碼容易理解。

—Michael Feathers

我總是發現計劃沒有用,但是製訂計劃不可或缺。

—Dwight D. Eisenhower

設計軟件有兩種方法:一種是簡單化,使其明顯沒有缺陷;另一種是復雜化,使其沒有明顯缺陷。前者要難得多。

—Tony Hoare

如果我們詢問客戶他們想要什麼,他們隻會說:“更快的馬。”

—Henry Ford

盡管一些聲明式程序員對等式推理( equational reasoning)隻會耍嘴皮子,但函數式語言的用戶每次運行編譯器時都會用到它們,無論他們是否注意到。

—Philip Wadler

How to declare an imperative

我們並不試圖爭取 Lisp程序員;我們在追趕 C++程序員。我們設法在他們到達 Lisp的半路上拽走他們。 —Guy Steele

人們“得到”類型,一直用著它們。告訴某人他不能用香蕉來敲釘子並不令其感到驚訝。

—Unknown

TDD代替瞭類型檢查器……正如烈酒代替瞭悲傷。 —byorgey

首先,調試的難度是編寫代碼的兩倍。因此,即使你把代碼寫得精彩絕倫,根據定義,你還不足以聰明地調試代碼。 —Brian W. Kernighan和 P. J. Plauger

一旦開始編程,令我們感到驚訝的是,很難讓程序按預想的方案正確地工作。不得不靠調試來弄明白。我還記得當意識到我此生的大部分時間都會用於尋找自己程序中的錯誤時的那一刻。

—Maurice Wilkes (1949)


序言


編程序既有趣又多金。許多人為瞭樂趣而編程,還能賺錢。從這種意義上說,程序員有點像演員、音樂傢或職業足球運動員。似乎是一個夢想,直到作為程序員的你開始負起真正的責任。從這個角度上說,編寫遊戲或辦公應用程序都沒有什麼大不瞭的。如果應用程序有一個 bug,你隻修復它並發布一個新版本即可。但如果你編寫的程序被人們依賴,並且還不能簡單地發布一個新版本後讓用戶們自行安裝,那就是另一種情況瞭。當然, Java並非用於編寫監控核電站或控製飛機的應用程序,或者是一個簡單的 bug就可能會置人類生命於風險中的係統。但如果你的程序用於管理互聯網骨乾,你一定不會願意在奧運會開幕前一天發現一個討厭的 bug,導緻整個國傢的電視傳輸失敗。對於這樣的程序,你希望確保它可以被證明是正確的。

大多數命令式程序無法被證明是正確的。測試隻允許我們在測試失敗時證明程序不正確。成功的測試說明不瞭什麼問題。你無法證明發布的程序是不正確的。就單綫程程序而言,大量的測試也許能夠說明你的代碼大部分是正確的。但是對於多綫程應用程序,條件組閤的數量使測試成為不可能。顯然,我們需要另一種不同的方式來編寫程序。在理想情況下,這種方法將允許我們證明程序是正確的。因為這一般不是完全可能的,所以一個很好的摺中是明確分離程序中可以被證明為正確的部分和不能證明為正確的部分。這就是函數式編程技術所能提供的。

函數式編程的定義與函數式程序員一樣多。有人說函數式編程是用函數編程。這是對的,但它無助於你瞭解這種編程範式的優勢。更重要的是,函數式編程需要將抽象推至極緻的理念。它允許明確分離程序中可以被證明為正確的部分與輸齣取決於外部條件的其他部分。通過這種方式,函數式程序是不太容易産生 bug的程序,它的 bug隻會駐留在特定的受限區域。

可以采用許多種技術來實現這一目標。使用不可變數據雖然不僅限於函數式編程,但卻是這樣一種技術。如果數據不能更改,你將不會有任何(不良的)意外,數據不會過期或損壞,沒有競爭條件,無須鎖住並發訪問,也不會有死鎖的風險。可以毫無風險地共享不可變數據。你不需要生成防禦性副本,那就沒有瞭忘記這樣做的風險。另一種技術是抽象控製結構,因此你不必冒著混淆循環索引和退齣條件的風險一次又一次地編寫相同的結構。完全刪除使用 null引用(無論是隱式還是顯式)將把你從臭名昭著的 NPE(空指針異常, NullPointerException)中解放齣來。通過所有這些技術(還有更多),你可以確信:如果程序通過編譯,那它就是正確的(也就是說,它的實現沒有 bug)。雖然這樣做並不能消除所有可能的 bug,但它更加安全。

計算機從一開始就基於寄存器中的可變值使用瞭命令式範式。正如其他許多被稱為“命令式語言”的編程語言一樣, Java似乎在很大程度上依賴於這種範式,但根本沒有必要。如果你是有經驗的 Java程序員,你可能會驚訝地發現無須更改變量的值就可以編寫有用的程序。這並非函數式編程的必要條件,但是函數式程序員幾乎總是自由自在地用著不可變數據。你可能也難以相信,可以在不使用 if…else結構、 while還有 for循環的情況下編寫程序。



用户评价

评分

给老公买的说是还不错

评分

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

评分

好书好书好书好书好书好书好书好书好书好书好书好书

评分

希望有用希望有用希望有用

评分

专业教材,正版图书,大学生适用。

评分

了解函数式编程,从头了解,可以推荐

评分

非常专业,研究性质的,不是很实用

评分

书还没看,包装完好,打折买的

评分

书还没看,包装完好,打折买的

相关图书

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有