買這商品的人也買了...
-
$780$616 -
$301Spark大數據實例開發教程
-
$750$675 -
$311Spark核心技術與高級應用
-
$505深入理解Spark:核心思想與源碼分析
-
$347Apache Spark源碼剖析
-
$383Scala 並發編程
-
$245Scala 學習手冊
-
$654$621 -
$301深入理解 Scala
-
$560$437 -
$520$442 -
$650$507 -
$580$458 -
$250函數式程式設計思維
-
$520$442 -
$230Spark Cookbook (中文版)
-
$420$357 -
$520$260 -
$520$442 -
$551快學 Scala, 2/e (Scala for the impatient, 2/e)
-
$490$417 -
$301企業大數據處理:Spark、Druid、Flume與Kafka應用實踐(BigData Processing with Spark,Druid,Flume and Kafka)
-
$480$379 -
$734Scala 編程, 3/e (Programming in Scala : Updated for Scala 2.12, 3/e)
相關主題
商品描述
<內容介紹>
函數式編程越來越多地從學術界走向工業界,很多和人們日常相關的重要系統背後都有函數式編程的身影,並且比例越來越高。在這種大的趨勢下,甚至很多指令式編程語言也受其影響加入了對一些函數式特徵的支持,比如Java 8終於將lambda加了進來。
基烏薩諾、比亞爾納松著的這本《Scala函數式編程》對想要接觸函數式編程,或在實際業務中已經使用函數式但想要系統鞏固函數式編程知識的程序員來說,是一本非常有價值的書。它以Scala為載體,涵蓋了函數式的基礎和高階特性。尤其裡面的一些高階特性是在其他書籍中極少介紹到的。因而,非常值得亟待解決高併發問題,或大數據領域從業的開發人員學習。
<章節目錄>
原推薦序
序言
致謝
關於本書
第一部分 函數式編程介紹
1 什麼是函數式編程
1.1 函數式編程的好處:一個簡單的例子
1.1.1 一段帶有副作用的程序
1.1.2 函數式的解法:去除副作用
1.2 (純)函數究竟是什麼
1.3 引用透明、純粹度以及替代模型
1.4 小結
2 在Scala中使用函數式編程
2.1 Scala語言介紹
2.2 運行程序
2.3 模塊、對象和命名空間
2.4 高階函數:把函數傳給函數
2.4.1 迂迴做法:使用循環方式
2.4.2 第一個高階函數
2.5 多態函數:基於類型的抽象
2.5.1 一個多態函數的例子
2.5.2 對高階函數傳入匿名函數
2.6 通過類型來實現多態
2.7 小結
3 函數式數據結構
3.1 定義函數式數據結構
3.2 模式匹配
3.3 函數式數據結構中的數據共享
3.3.1 數據共享的效率
3.3.2 改進高階函數的類型推導
3.4 基於list的遞歸併泛化為高階函數
3.4.1 更多與列表相關的函數
3.4.2 用簡單組件組合list函數時的效率損失
3.5 樹
3.6 小結
4 不是用異常來處理錯誤
4.1 異常的優點與劣勢
4.2 異常的其他選擇
4.3 Option數據類型
4.3.1 Option的使用模式
4.3.2 Option的組合、提升及對面向異常的API的包裝
4.4 Either數據類型
4.5 小結
5 嚴格求值和惰性求值
5.1 嚴格和非嚴格函數
5.2 一個擴展例子:惰性列表
5.2.1 對Stream保持記憶,避免重複運算
5.2.2 用於檢測Stream的helper函數
5.3 把函數的描述與求值分離
5.4 無限流與共遞歸
5.5 小結
6 純函數式狀態
6.1 以副作用方式生成隨機數
6.2 純函數式隨機數生成器
6.3 用純函數式實現帶狀態的API
6.4 狀態行為的更好的API
6.4.1 組合狀態行為
6.4.2 嵌套狀態行為
6.5 更通用的狀態行為數據類型
6.6 純函數式命令編程
6.7 小結
第二部分 功能設計和組合子庫
7 純函數式的並行計算
7.1 選擇數據類型和函數
7.1.1 一種用於並行計算的數據類型
7.1.2 組合併行計算
7.1.3 顯性分流
7.2 確定表現形式
7.3 完善API
7.4 API與代數
7.4.1 映射法則
7.4.2 分流法則
7.4.3 打破法則:一個微妙的bug
7.4.4 用Actor實現一個完全無阻塞的Par
7.5 完善組合子為更通用的形式
7.6 小結
8 基於性質的測試
8.1 基於性質測試概覽
8.2 選擇數據類型和函數
8.2.1 API的初始代碼片段
8.2.2 性質的含義與API
8.2.3 生成器的意義和API
8.2.4 生成值決定生成器
8.2.5 精煉Prop的數據類型
8.3 最小化測試用例
8.4 使用庫並改進其易用性
8.4.1 一些簡單的例子
8.4.2 為並行計算編寫測試套件
8.5 測試高階函數及展望未來
8.6 生成器法則
8.7 小結
9 語法分析器組合子
9.1 代數設計,走起
9.2 一種可能的代數
9.2.1 切片和非空重複
9.3 處理上下文的相關性
9.4 寫一個JSON分析器
9.4.1 JSON格式
9.4.2 JSON分析器
9.5 錯誤提示
9.5.1 一種可行的設計
9.5.2 錯誤嵌套
9.5.3 控制分支和回溯軌跡
9.6 實現代數
9.6.1 一種可能的實現
9.6.2 串化分析器
9.6.3 標記分析器
9.6.4 故障轉移和回溯
9.6.5 上下文相關的分析
9.7 小結
第三部分 函數設計的通用結構
10 Monoid
10.1 什麼是monoid
10.2 使用monoid摺疊列表
10.3 結合律和並行化
10.4 例子:並行解析
10.5 可摺疊數據結構
10.6 組合monoid
10.6.1 組裝更加複雜的monoid
10.6.2 使用組合的monoid融合多個遍歷
10.7 小結 151
11 Monad
11.1 函子:對map函數的泛化
11.1.1 函子法則
11.2 Monad:對flatMap和unit函數的泛化
11.3 Monadic組合子
11.4 單子定律
11.4.1 結合法則
11.4.2 為指定的monad證明結合法則
11.4.3 單位元法則
11.5 什麼是monad
11.5.1 identity monad
11.5.2 狀態monad和partial type application
11.6 小結
12 可應用和可遍歷函子
12.1 泛化單子
12.2 Applicative trait
12.3 單子與可應用函子的區別
12.3.1 對比Option applicative與Option monad
12.3.2 對比Parser applicative與Parser monad
12.4 可應用函子的優勢
12.4.1 不是所有的可應用函子都是Monad
12.5 可應用法則
12.5.1 Left and right identity
12.5.2 結合律
12.5.3 Naturality of product
12.6 可遍歷函子
12.7 使用Traverse
12.7.1 從monoid到可應用函子
12.7.2 帶狀態的遍歷
12.7.3 組合可遍歷結構
12.7.4 遍歷融合
12.7.5 嵌套遍歷
12.7.6 Monad組合
12.8 小結
第四部分 作用與I/O
13 外部作用和I/O
13.1 分解作用
13.2 一個簡單的IO類型
13.2.1 處理輸入效果
13.2.2 簡單IO類型的優缺點
13.3 避免棧溢出
13.3.1 將一個控制流轉化為數據構造子
13.3.2 Trampolining:棧溢出的通用解決方法
13.4 一個更微妙的IO類型
13.4.1 合理的monad
13.4.2 一個支持控制台I/O的monad
13.4.3 純解釋器
13.5 非阻塞和異步I/O
13.6 一個通用的IO類型
13.6.1 最終的main程序
13.7 為什麼IO類型不足以支撐流式I/O
13.8 小結
14 本地影響和可變狀態
14.1 純函數式的可變狀態
14.2 一種限制副作用範圍的數據類型
14.2.1 受限可變性的語言表達
14.2.2 一種可變引用的代數表達
14.2.3 執行修改狀態的行為
14.2.4 可變量組
14.2.5 一個純函數的in-place快排實現
14.3 純粹是相對於上下文的
14.3.1 副作用是什麼?
14.4 小結
15 流式處理與增量I/O
15.1 命令式I/O的問題示例
15.2 一個簡單的流轉換器
15.2.1 創建Process
15.2.2 組合和追加處理
15.2.3 處理文件
15.3 可擴展的處理類型
15.3.1 來源
15.3.2 保證資源安全
15.3.3 單一輸入過程
15.3.4 多個輸入流
15.3.5 去向
15.3.6 Effectful通道
15.3.7 動態資源分配
15.4 應用場景
15.5 小結