[ 收藏 ] [ 简体中文 ]  
臺灣貨到付款、ATM、超商、信用卡PAYPAL付款,4-7個工作日送達,999元臺幣免運費   在線留言 商品價格為新臺幣 
首頁 電影 連續劇 音樂 圖書 女裝 男裝 童裝 內衣 百貨家居 包包 女鞋 男鞋 童鞋 計算機周邊

商品搜索

 类 别:
 关键字:
    

商品分类

  •  管理

     一般管理学
     市场/营销
     会计
     金融/投资
     经管音像
     电子商务
     创业企业与企业家
     生产与运作管理
     商务沟通
     战略管理
     商业史传
     MBA
     管理信息系统
     工具书
     外文原版/影印版
     管理类职称考试
     WTO
     英文原版书-管理
  •  投资理财

     证券/股票
     投资指南
     理财技巧
     女性理财
     期货
     基金
     黄金投资
     外汇
     彩票
     保险
     购房置业
     纳税
     英文原版书-投资理财
  •  经济

     经济学理论
     经济通俗读物
     中国经济
     国际经济
     各部门经济
     经济史
     财政税收
     区域经济
     统计 审计
     贸易政策
     保险
     经济数学
     各流派经济学说
     经济法
     工具书
     通货膨胀
     财税外贸保险类考试
     英文原版书-经济
  •  社会科学

     语言文字
     社会学
     文化人类学/人口学
     新闻传播出版
     社会科学总论
     图书馆学/档案学
     经典名家作品集
     教育
     英文原版书-社会科学
  •  哲学

     哲学知识读物
     中国古代哲学
     世界哲学
     哲学与人生
     周易
     哲学理论
     伦理学
     哲学史
     美学
     中国近现代哲学
     逻辑学
     儒家
     道家
     思维科学
     马克思主义哲学
     经典作品及研究
     科学哲学
     教育哲学
     语言哲学
     比较哲学
  •  宗教

  •  心理学

  •  古籍

     经部  史类  子部  集部  古籍管理  古籍工具书  四库全书  古籍善本影音本  中国藏书
  •  文化

     文化评述  文化随笔  文化理论  传统文化  世界各国文化  文化史  地域文化  神秘文化  文化研究  民俗文化  文化产业  民族文化  书的起源/书店  非物质文化遗产  文化事业  文化交流  比较文化学
  •  历史

     历史普及读物
     中国史
     世界史
     文物考古
     史家名著
     历史地理
     史料典籍
     历史随笔
     逸闻野史
     地方史志
     史学理论
     民族史
     专业史
     英文原版书-历史
     口述史
  •  传记

  •  文学

  •  艺术

     摄影
     绘画
     小人书/连环画
     书法/篆刻
     艺术设计
     影视/媒体艺术
     音乐
     艺术理论
     收藏/鉴赏
     建筑艺术
     工艺美术
     世界各国艺术概况
     民间艺术
     雕塑
     戏剧艺术/舞台艺术
     艺术舞蹈
     艺术类考试
     人体艺术
     英文原版书-艺术
  •  青春文学

  •  文学

     中国现当代随笔
     文集
     中国古诗词
     外国随笔
     文学理论
     纪实文学
     文学评论与鉴赏
     中国现当代诗歌
     外国诗歌
     名家作品
     民间文学
     戏剧
     中国古代随笔
     文学类考试
     英文原版书-文学
  •  法律

     小说
     世界名著
     作品集
     中国古典小说
     四大名著
     中国当代小说
     外国小说
     科幻小说
     侦探/悬疑/推理
     情感
     魔幻小说
     社会
     武侠
     惊悚/恐怖
     历史
     影视小说
     官场小说
     职场小说
     中国近现代小说
     财经
     军事
  •  童书

  •  成功/励志

  •  政治

  •  军事

  •  科普读物

  •  计算机/网络

     程序设计
     移动开发
     人工智能
     办公软件
     数据库
     操作系统/系统开发
     网络与数据通信
     CAD CAM CAE
     计算机理论
     行业软件及应用
     项目管理 IT人文
     计算机考试认证
     图形处理 图形图像多媒体
     信息安全
     硬件
     项目管理IT人文
     网络与数据通信
     软件工程
     家庭与办公室用书
  •  建筑

     执业资格考试用书  室内设计/装潢装修  标准/规范  建筑科学  建筑外观设计  建筑施工与监理  城乡规划/市政工程  园林景观/环境艺术  工程经济与管理  建筑史与建筑文化  建筑教材/教辅  英文原版书-建筑
  •  医学

     中医
     内科学
     其他临床医学
     外科学
     药学
     医技学
     妇产科学
     临床医学理论
     护理学
     基础医学
     预防医学/卫生学
     儿科学
     医学/药学考试
     医院管理
     其他医学读物
     医学工具书
  •  自然科学

     数学
     生物科学
     物理学
     天文学
     地球科学
     力学
     科技史
     化学
     总论
     自然科学类考试
     英文原版书-自然科学
  •  工业技术

     环境科学
     电子通信
     机械/仪表工业
     汽车与交通运输
     电工技术
     轻工业/手工业
     化学工业
     能源与动力工程
     航空/航天
     水利工程
     金属学与金属工艺
     一般工业技术
     原子能技术
     安全科学
     冶金工业
     矿业工程
     工具书/标准
     石油/天然气工业
     原版书
     武器工业
     英文原版书-工业技
  •  农业/林业

     园艺  植物保护  畜牧/狩猎/蚕/蜂  林业  动物医学  农作物  农学(农艺学)  水产/渔业  农业工程  农业基础科学  农林音像
  •  外语

  •  考试

  •  教材

  •  工具书

  •  中小学用书

  •  中小学教科书

  •  动漫/幽默

  •  烹饪/美食

  •  时尚/美妆

  •  旅游/地图

  •  家庭/家居

  •  亲子/家教

  •  两性关系

  •  育儿/早教

  •  保健/养生

  •  体育/运动

  •  手工/DIY

  •  休闲/爱好

  •  英文原版书

  •  港台图书

  •  研究生
     工学
     公共课
     经济管理
     理学
     农学
     文法类
     医学

  •  音乐
     音乐理论

     声乐  通俗音乐  音乐欣赏  钢琴  二胡  小提琴
  • C#函數式編程(第2版)
    該商品所屬分類:計算機/網絡 -> 程序設計
    【市場價】
    635-920
    【優惠價】
    397-575
    【作者】 美恩裡科·博南諾Enrico 
    【所屬類別】 圖書  計算機/網絡  程序設計  CC++C#VCVC++ 
    【出版社】清華大學出版社 
    【ISBN】9787302633341
    【折扣說明】一次購物滿999元台幣免運費+贈品
    一次購物滿2000元台幣95折+免運費+贈品
    一次購物滿3000元台幣92折+免運費+贈品
    一次購物滿4000元台幣88折+免運費+贈品
    【本期贈品】①優質無紡布環保袋,做工棒!②品牌簽字筆 ③品牌手帕紙巾
    版本正版全新電子版PDF檔
    您已选择: 正版全新
    溫馨提示:如果有多種選項,請先選擇再點擊加入購物車。
    *. 電子圖書價格是0.69折,例如了得網價格是100元,電子書pdf的價格則是69元。
    *. 購買電子書不支持貨到付款,購買時選擇atm或者超商、PayPal付款。付款後1-24小時內通過郵件傳輸給您。
    *. 如果收到的電子書不滿意,可以聯絡我們退款。謝謝。
    內容介紹



    開本:16開
    紙張:膠版紙
    包裝:平裝-膠訂

    是否套裝:否
    國際標準書號ISBN:9787302633341
    作者:[美]恩裡科·博南諾(Enrico

    出版社:清華大學出版社
    出版時間:2023年06月 

        
        
    "

    產品特色

    編輯推薦

      如果你正在嘗試或計劃學習一門函數式語言,那麼本書將非常有價值,因為本書能教會你使用熟悉的語言進行函數式思考。全書內容共有19章,分為4部分:第1部分介紹函數式編程的基本原理;第II部分展示函數技術的-.些實際應用;第II部分介紹函數式設計,主要涉及函數的錯誤處理、模塊化和組合應用程序、理解狀態和表示變化的函數式方法等內容;第IV部分討論更高級的主題,包括惰性計算、有狀態計算、異步、數據流和並發。
      本書是針對.NET 6和C# 10更新的函數式編程,適用於C#中級程序員。你需要了解.NET和C#或者類似的語言,如Java、Swift 或Kotlin;需要具有開發實際應用程序的經驗;需要熟悉OOP概念、模式和最佳實踐;並且希望通過學習函數技術來擴展知識庫,以最大限度地將C#作為一種多範例語言。

     
    內容簡介

    函數式編程將改變你思考代碼的方式!利用良好的FP技術,C#開發人員可極大地提升軟件的並發處理、狀態管理和事件處理能力,以及軟件的可維護性。本書介紹了在C#編碼實踐中添加函數式編程的原因、方式和位置。 《C#函數式編程(第2版)》引導你在C#語言中使用函數式思想來解決實際問題。書中回顧了C#語言中一些能夠用來實現函數式編程的語言特性,並且通過許多實際的例子展示了函數組合、數據驅動編程和不可變數據結構的強大功能。所有代碼示例均可用於.NET 6和C# 10。 主要內容 ● 高階函數減少了代碼的重復,可用更少的代碼執行更多的操作 ● 基於純函數的代碼易於測試和優化 ● 編寫高質量的API,準確描述程序的行為 ● 編寫函數式風格的Web API ● 與LINQ的單組合

    作者簡介

    Enrico Buonanno於2001年獲得哥倫比亞大學計算機科學碩士學位,此後一直從事軟件開發和架構師工作。他曾在金融科技(包括國際清算銀行、巴克萊銀行和瑞銀集團)和其他技術驅動型業務的著名公司從事關鍵項目的開發。

    目錄
    第Ⅰ部分 入門
    第1章 介紹函數式編程 3
    1.1 什麼是函數式編程 3
    1.1.1 函數作為第一類值 4
    1.1.2 避免狀態突變 4
    1.1.3 編寫具有強力保證的程序 5
    1.2 C#語言中的函數式編程 8
    1.2.1 LINQ的函數式性質 8
    1.2.2 函數式編碼的簡短語法 10
    1.2.組的語言支持 11
    1.2.4 模式匹配和記錄類型 13
    1.3 將在本書中學到什麼 16
    1.4 本章小結 17
    第2章 函數思維 19

    第Ⅰ部分  入門
    第1章  介紹函數式編程 3
    1.1  什麼是函數式編程 3
    1.1.1  函數作為第一類值 4
    1.1.2  避免狀態突變 4
    1.1.3  編寫具有強力保證的程序 5
    1.2  C#語言中的函數式編程 8
    1.2.1  LINQ的函數式性質 8
    1.2.2  函數式編碼的簡短語法 10
    1.2.3 &nb組的語言支持 11
    1.2.4  模式匹配和記錄類型 13
    1.3  將在本書中學到什麼 16
    1.4  本章小結 17
    第2章  函數思維 19
    2.1  什麼是函數 19
    2.1.1  映射函數 19
    2.1.2  在C#中表示函數 20
    2.2  高階函數 24
    2.2.1  依賴其他函數的函數 24
    2.2.2  適配器函數 26
    2.2.3  創建其他函數的函數 26
    2.3  使用HOF避免重復 27
    2.4  練習 30
    2.5  本章小結 31
    第3章  函數純潔性很重要 33
    3.1  什麼是函數的純潔性 33
    3.1.1  純潔性和副作用 34
    3.1.2  管理副作用的策略 35
    3.2  通過避免狀態突變實現並行化 37
    3.2.1  純函數可良好地並行化 38
    3.2.2  並行化不純函數 39
    3.2.3  避免狀態突變 40
    3.3  純潔性和可測性 43
    3.3.1  隔離I/O影響 43
    3.3.2  實踐:一個業務驗證場景 44
    3.3.3  為什麼很難測試不純函數 46
    3.4  執行I/O的測試代碼 47
    3.4.1  面向對像的依賴注入 48
    3.4.2  可測試性沒有那麼多樣板 51
    3.5  純潔性和計算的發展 53
    3.6  練習 54
    3.7  本章小結 54
    第Ⅱ部分  核心技術
    第4章  設計函數簽名和類型 57
    4.1  設計函數簽名 57
    4.1.1  使用箭頭符號編寫簽名 58
    4.1.2  簽名的信息量有多大 58
    4.2  使用數據對像捕獲數據 59
    4.2.1  原始類型通常不夠具體 60
    4.2.2  使用自定義類型約束輸入 61
    4.2.3  編寫“誠實的”函數 62
    4.2.4  把值組合到復雜的數據對像中 64
    4.3  使用Unit為數據缺失建模 65
    4.3.1  為什麼void不理想 65
    4.3.2  彌合Action和Func之間的差異 67
    4.4  本章小結 68
    第5章  為數據可能缺失建模 69
    5.1  每天都在使用糟糕的API 69
    5.2  Option類型的介紹 71
    5.3  實現Option 73
    5.3.1  Option的理想實現 73
    5.3.2  使用Option 73
    5.3.3  創建None 74
    5.3.4  創建Some 75
    5.3.5  優化Option實現 76
    5.4  Option作為偏函數的自然結果類型 78
    5.4.1  解析字符串 78
    5.4.2  在集合中查找數據 79
    5.4.3  智能構造函數模式 80
    5.5  處理null 81
    5.5.1  為什麼null是一個糟糕的想法 81
    5.5.2  使用Option替代null來獲得健壯性 82
    5.5.3  不可空的引用類型 83
    5.5.4  防止NullReference-Exception 85
    5.6  練習 86
    5.7  本章小結 87
    第6章  函數式編程中的模式 89
    6.1  將函數應用於結構的內部值 89
    6.1.1  將函數映射到序列上 89
    6.1.2  將函數映射到Option 90
    6.1.3  Option是如何提高抽像級別的 93
    6.1.4  函子 93
    6.2  使用ForEach執行副作用 94
    6.3  使用Bind鏈接函數 96
    6.3.1  將返回Option的函數組合起來 97
    6.3.2  使用Bind平鋪嵌套列表 98
    6.3.3  實際上,這被稱為單子 100
    6.3.4  Return函數 100
    6.3.5  函子和單子之間的關繫 101
    6.4  使用Where過濾值 101
    6.5  使用Bind組合Option和IEnumerable 102
    6.6  在不同抽像級別上編碼 104
    6.6.1  常規值與高級值 104
    6.6.2  跨越抽像級別 105
    6.6.3  重新審視Map與Bind 106
    6.6.4  在正確的抽像級別上工作 107
    6.7  練習 107
    6.8  本章小結 108
    第7章  使用函數組合設計程序 109
    7.1  函數組合 109
    7.1.1  復習函數組合 109
    7.1.2  方法鏈 110
    7.1.3  高級界域中的組合 112
    7.2  從數據流的角度進行思考 113
    7.2.1  使用LINQ的可組合API 113
    7.2.2  編寫可組合性更好的函數 114
    7.3  工作流編程 116
    7.3.1  關於驗證的一個簡單工作流 116
    7.3.2  以數據流的思想進行重構 117
    7.3.3  組合帶來了更大的靈活性 118
    7.4  介紹函數式領域建模 119
    7.5  端到端的服務器端工作流 120
    7.5.1  表達式與語句 122
    7.5.2  聲明式與命令式 122
    7.5.3  函數式分層 123
    7.6  練習 124
    7.7  本章小結 125
    第Ⅲ部分  函數式設計
    第8章  函數式錯誤處理 129
    8.1  表示輸出的更安全方式 130
    8.1.1  使用Either捕獲錯誤細節 130
    8.1.2  處理Either的核心函數 133
    8.1.3  比較Option和Either 134
    8.2  鏈接操作可能失敗 135
    8.3  驗證:Either的一個完美用例 137
    8.3.1  為錯誤選擇合適的表示法 137
    8.3.2  定義一個基於Either的API 138
    8.3.3  添加驗證邏輯 139
    8.4  將輸出提供給客戶端應用程序 140
    8.4.1  公開一個類似Option的接口 141
    8.4.2  公開一個類似Either的接口 142
    8.4.3  返回一個DTO結果 143
    8.5  Either的變體 144
    8.5.1  在不同的錯誤表示之間進行更改 144
    8.5.2  Either的特定版本 145
    8.5.3  重構Validation和
    Exceptional 146
    8.5.4  保留異常 149
    8.6  練習 150
    8.7  本章小結 151
    第9章  用函數構造應用程序 153
    9.1  偏函數應用:逐個提供參數 153
    9.1.1  手動啟用偏函數應用 155
    9.1.2  歸納偏函數應用 156
    9.1.3  參數的順序問題 157
    9.2  克服方法解析的怪癖 158
    9.3  柯裡化函數:優化偏函數應用 160
    9.4  創建一個友好的偏函數應用API 162
    9.4.1  可文檔化的類型 163
    9.4.2  特殊化數據訪問函數 164
    9.5  應用程序的模塊化及組合 166
    9.5.1  OOP中的模塊化 167
    9.5.2  FP中的模塊化 168
    9.5.3  將函數映射到API端點 171
    9.5.4  比較兩種方法 173
    9.6  將列表壓縮為單個值 174
    9.6.1  LINQ的Aggregate方法 174
    9.6.2  聚合驗證結果 176
    9.6.3  收集驗證錯誤 177
    9.7  練習 178
    9.8  本章小結 178
    第10章  有效地處理多參函數 181
    10.1  高級界域中的函數應用程序 181
    10.1.1  理解應用式 183
    10.1.2  提升函數 185
    10.1.3  基於屬性的測試 186
    10.2  函子、應用式、單子 188
    10.3  單子定律 190
    10.3.1   190
    10.3.2   190
    10.3.3  結合律 191
    10.3.4  對多參函數使用Bind 193
    10.4  通過對任何單子使用LINQ來提高可讀性 193
    10.4.1  對任意函子使用LINQ 194
    10.4.2  對任意單子使用LINQ 195
    10.4.3  let、where及其他LINQ子句 198
    10.5  何時使用Bind或Apply 199
    10.5.1  具有智能構造函數的驗證 199
    10.5.2  使用應用式流收集錯誤 201
    10.5.3  使用單子流快速失敗 202
    10.6  練習 203
    10.7  本章小結 203
    第11章  表示狀態和變化 205
    11.1  狀態突變的陷阱 205
    11.2  理解狀態、標識及變化 208
    11.2.1  有些事物永遠不變 209
    11.2.2  表示非突變的變化 211
    11.3  使用記錄捕獲域實體的狀態 212
    11.3.1  對記錄初始化的細粒度控制 214
    11.3.2  所有這些都是不可變的 216
    11.4  數據與邏輯分離 218
    11.5  本章小結 220
    第12章  函數式數據結構簡介 221
    12.1  經典的函數鏈表 222
    12.1.1  常見的列表操作 224
    12.1.2  修改不可變列表 225
    12.1.3  解構任何IEnumerable 227
    12.2  二叉樹 227
    12.2.1  常見的樹操作 228
    12.2.2  結構共享 230
    12.3  結論 231
    12.4  練習 231
    12.5  本章小結 232
    第13章  事件溯源:持久化的函數式方法 233
    13.1  關於數據存儲的函數式思考 234
    13.1.1  為什麼數據存儲隻能追加 234
    13.1.2  放松,並忘卻存儲狀態 235
    13.2  事件溯源的基礎知識 236
    13.2.1  表示事件 236
    13.2.2  持久化事件 237
    13.2.3  表示狀態 238
    13.2.4  表示狀態轉換 239
    13.2.5  從過去的事件中重建當前狀態 240
    13.3  事件溯源繫統的架構 241
    13.3.1  處理命令 243
    13.3.2  處理事件 245
    13.3.3  添加驗證 246
    13.3.4  創建事件數據的視圖 248
    13.4  比較不同的不可變存儲方法 251
    13.4.1  Datomic與Event Store 252
    13.4.2  領域是否受事件驅動 252
    13.5  本章小結 253
    第Ⅳ部分  高級技術
    第14章  惰性計算、延續以及單子組合之美 257
    14.1  惰性的優點 258
    14.1.1  用於處理Option的惰性API 258
    14.1.2  組合惰性計算 261
    14.2  使用Try進行異常處理 263
    14.2.1  表示可能失敗的計算 263
    14.2.2  從JSON對像中安全地提取信息 264
    14.2.3  組合可能失敗的計算 266
    14.2.4  單子組合 267
    14.3  為數據庫訪問創建中間件管道 268
    14.3.1  組合執行安裝/拆卸操作的函數 268
    14.3.2  逃離阨運金字塔的秘方 269
    14.3.3  捕獲中間件函數的本質 270
    14.3.4  實現中間件的查詢模式 272
    14.3.5  添加計時操作的中間件 274
    14.3.6  添加管理數據庫事務的中間件 275
    14.4  本章小結 277
    第15章  有狀態的程序和計算 279
    15.1  管理狀態的程序 280
    15.1.1  將數據緩存到內存中 281
    15.1.2  重構以實現可測試性和錯誤處理 283
    15.1.3  有狀態的計算 285
    15.2  一種用於生成隨機數據的語言 285
    15.2.1  生成隨機整數 286
    15.2.2  生成 287
    15.2.3  生成復雜的結構 288
    15.3  有狀態計算的通用模式 290
    15.4  本章小結 293
    第16章  使用異步計算 295
    16.1  異步計算 295
    16.1.1  對異步的需求 296
    16.1.2  用Task表示異步操作 297
    16.1.3  一個Task即為一個將來值的容器 298
    16.1.4  處理失敗 300
    16.1.5  一個用於貨幣轉換的HTTP API 302
    16.1.6  如果失敗,請再試幾次 303
    16.1.7  並行運行異步操作 304
    16.2  異步流 306
    16.2.1  以異步流的方式讀取文件 307
    16.2.2  以函數方式使用異步流 308
    16.2.3  從多個流中消費數據 309
    16.2.4  使用異步流進行聚合和排序 309
    16.3  本章小結 310
    第17章  遍歷和堆疊的單子 311
    17.1  遍歷:處理高級值列表 311
    17.1.1  使用單子的Traverse驗證值列表 313
    17.1.2  使用應用式Traverse收集驗證錯誤 314
    17.1.3  將多個驗證器應用於單個值 316
    17.1.4  組合使用Traverse與Task以等待多個結果 317
    17.1.5  為單值結構定義Traverse 319
    17.2  組合異步和驗證(或其他任何兩個單子效果) 320
    17.2.1  堆疊單子的問題 320
    17.2.2  減少結果的數量 322
    17.2.3  具有一個單子堆疊的LINQ表達式 323
    17.3  本章小結 325
    第18章  數據流和Reactive Extensions 327
    18.1  用IObservable表示數據流 328
    18.1.1  時間上的一個值序列 328
    18.1.2  訂閱IObservable 329
    18.2  創建IObservable 331
    18.2.1  創建定時器 331
    18.2.2  使用Subject告知IObservable應何時發出信號 332
    18.2.3  從基於回調的訂閱中創建IObservable 333
    18.2.4  由更簡單的結構創建IObservable 334
    18.3  轉換和組合數據流 335
    18.3.1  流的轉換 335
    18.3.2  組合和劃分流 337
    18.3.3  使用IObservable進行錯誤處理 339
    18.3.4  融會貫通 340
    18.4  實現貫穿多個事件的邏輯 341
    18.4.1  檢測按鍵順序 342
    18.4.2  對事件源做出反應 344
    18.4.3  通知賬戶何時透支 346
    18.5  應該何時使用IObservable 348
    18.6  本章小結 349
    第19章  並發消息傳遞 351
    19.1  對共享可變狀態的需要 351
    19.2  理解並發消息傳遞 353
    19.2.1  在C#中實現代理 355
    19.2.2  開始使用代理 356
    19.2.3  使用代理處理並發
    請求 357
    19.2.4  代理與角色 361
    19.3 “函數式API”與“基於代理的實現” 362
    19.3.1  代理作為實現細節 362
    19.3.2  將代理隱藏於常規API的背後 364
    19.4  LOB應用程序中的並發消息傳遞 364
    19.4.1  使用代理來同步訪問賬戶數據 365
    19.4.2  保管賬戶的注冊表 366
    19.4.3  代理不是對像 368
    19.4.4  融會貫通 370
    19.5  本章小結 371
    附錄A  使用C#的舊版本 373
    A.1  C#9之前的不可變數據對像 373
    A.1.1  約定不變性 373
    A.1.2  定義復制方法 374
    A.1.3  強制不變性 375
    A.1.4  一直不變 376
    A.1.5  復制方法沒有樣板 377
    A.1.6  不變性策略的比較 379
    A.2  C# 8之前的模式匹配 379
    A.2.1  C#對模式匹配的增量支持 380
    A.2.2  模式匹配表達式的自定義解決方案 381
     A.3  再次討論事件溯源的示例 382
    A.4  結論 384
    結束語 385
     


     

    前言
    函數式編程(Functional Programming,FP)已成為主流編程中一個重要且令人興奮的組成部分。在2010年代創建的大多數新語言和框架都是函數式的,這導致一些人預測編程的未來是函數式的。與此同時,流行的面向對像(Object-Oriented,OO)語言,如C#和Java,在每個新版本中都引入了更多的函數式特性,支持多範式編程風格。然而,C#社區的采用速度很慢。為什麼會這樣呢?我認為,其中一個原因是缺乏優秀的文獻:
    l 大多數FP文獻都是用函數式語言編寫的,特別是Haskell。對於具有OOP背景的開發人員來說,這對學習FP概念造成了編程語言上的障礙。盡管許多概念適用於像C#這樣的多範式語言,但同時學習一門新的範式和一門新的語言是一項艱巨的任務。
    l 更重要的是,文獻中的大多數書籍傾向於用數學或計算機科學領域的例子來說明函數式技術和概念。對於大多數終日從事業務(Line of Business,LOB)應用程序開發的程序員來說,這造成了一個領域空白,並使得他們難以知悉這些技術與實際應用程序間的相關性。

    函數式編程(Functional Programming,FP)已成為主流編程中一個重要且令人興奮的組成部分。在2010年代創建的大多數新語言和框架都是函數式的,這導致一些人預測編程的未來是函數式的。與此同時,流行的面向對像(Object-Oriented,OO)語言,如C#和Java,在每個新版本中都引入了更多的函數式特性,支持多範式編程風格。然而,C#社區的采用速度很慢。為什麼會這樣呢?我認為,其中一個原因是缺乏優秀的文獻:
    l 大多數FP文獻都是用函數式語言編寫的,特別是Haskell。對於具有OOP背景的開發人員來說,這對學習FP概念造成了編程語言上的障礙。盡管許多概念適用於像C#這樣的多範式語言,但同時學習一門新的範式和一門新的語言是一項艱巨的任務。
    l 更重要的是,文獻中的大多數書籍傾向於用數學或計算機科學領域的例子來說明函數式技術和概念。對於大多數終日從事業務(Line of Business,LOB)應用程序開發的程序員來說,這造成了一個領域空白,並使得他們難以知悉這些技術與實際應用程序間的相關性。
    這些缺陷成為我學習FP道路上的主要絆腳石。許多書試圖解釋什麼是“柯裡化”,通過用數字3創建一個可以將3加到任何數字上的函數,以展示add函數是如何被柯裡化的(在你能想到的所有應用中,它有一點實際用處嗎?)。拋棄這些書後,我決定開闢自己的研究路徑。這需要學習6種函數式語言,並通過實驗找出其中哪些FP概念可以有效地應用於C#中,並應用於大多數開發人員有償編寫的應用程序中。我的研究成果最終通過本書得以展現。
    本書不僅展示如何在C#語言中利用函數式技術,為C#開發人員彌合語言鴻溝,還展示如何將函數式技術應用於典型的業務場景來彌合領域差距。我采用了一種實用的方法,並在一定程度上涵蓋了函數式技術,使它們在典型的LOB應用程序場景中有用,並省去了FP背後的大部分理論。畢竟,我們關注FP,是因為它具有以下優點:
    l 強大——這意味著可以用更少的代碼完成更多的工作。FP提高了抽像級別,允許編寫高級代碼,同時將程序員從增加復雜性但沒有價值的低級技術問題中解放出來。
    l 安全——FP反對狀態突變。這意味著用函數式風格編寫的程序不太可能進入無效狀態。此外,在處理並發性時,狀態變化的保守方法是非常有益的。用命令式風格編寫的程序在單線程實現中可能工作得很好,但當出現並發性時,就會導致各種各樣的缺陷(bug)。函數式代碼在並發場景中提供了更好的保證,所以在多核處理器時代,對FP的興趣激增是很自然的。
    l 清晰——相對於編寫新代碼,我們會花費更多的時間來維護和使用現有的代碼,所以代碼清晰且意義明確是很重要的。當你學會函數式思維時,就能夠輕松編寫這種清晰的代碼。
    如果你已經用OO風格編程一段時間了,那麼在本書中的概念實現之前,可能需要一點努力和意願來進行實驗。為了確保學習FP是一個愉快和有益的過程,這裡有兩個建議:
    l 保持耐心。有些部分可能要多次閱讀。也可能把這本書放下幾個星期後,當你再次拿起它時,一些看似模糊的東西突然開始變得明朗起來。
    l 實驗代碼。實踐出真知。本書提供了許多示例和練習,許多代碼片段可以在REPL中進行測試。
    你的同事可能沒有你那麼熱衷於探索。由於預料到他們可能抗議你采用這種新的編碼風格,並困惑地看著代碼,說:“為什麼不隻是做x呢?”(其中x是枯燥的、過時的,而且通常是有害的)。此時,請不要過多地和他們討論。隻需要坐下來等待,等他們踫壁而歸時,用你的技巧解決他們屢次遇到的問題。



     
    關於本書


     


    本書旨在展示如何利用C#中的函數技術來編寫簡潔、優雅、健壯和可維護的代碼。
    本書讀者對像
    本書是為雄心勃勃的開發人員編寫的。你需要知道.NET和C#或者類似的語言,如Java、Swift或Kotlin;需要具有開發實際應用程序的經驗;需要熟悉OOP概念、模式和最佳實踐;並且希望通過學習函數技術來擴展知識庫,以最大限度地將C#用作一種多範式語言。
    如果你正在嘗試或計劃學習一門函數式語言,那麼本書將非常有價值,因為本書將教會你用熟悉的語言進行函數式思考。改變思維方式是很難的,而一旦做到這一點,學習任何一種特定語言的語法都會相對容易。
    本書結構:路線圖
    全書內容共有19章,分為以下4部分:
    l 第Ⅰ部分介紹了函數式編程的基本原理。首先講解什麼是函數式編程,以及C#如何支持函數式編程。然後討論高階函數的冪和純函數的重要性。讀完第Ⅰ部分後,你將獲得有用的概念性和實用性工具以學習更具體的函數式技術。
    l 第Ⅱ部分展示了函數技術的一些實際應用:如何設計類型和函數簽名,以及如何將簡單的函數組合到復雜的程序中。讀完第Ⅱ部分後,你會明白用函數式風格編寫的程序是什麼樣的,以及這種風格所帶來的好處。
    l 有了這些基本概念,第Ⅲ部分將加快講解速度,並繼續關注更廣泛的問題,如函數的錯誤處理,模塊化和組合應用程序,以及理解狀態和表示變化的函數式方法。讀完第Ⅲ部分後,你將獲得一繫列工具,以使用函數式方法有效地處理許多編程任務。
    l 第Ⅳ部分討論了更高級的主題,包括惰性計算、有狀態計算、異步、數據流和並發。第Ⅳ部分的每一章均介紹了一些重要的技術,這些技術有可能完全改變你編寫和思考軟件的方式。
    你會在每一章中找到更詳細的主題分類,並在閱讀任何特定章節之前,都能從本書的封二了解到需要預先閱讀哪些章節。
    為實際應用程序編寫代碼
    本書的目標是保持真實的現實場景。為此,許多示例都涉及實際任務,如讀取配置、連接到數據庫、驗證HTTP請求等。你可能已經知道如何完成這些任務,但本書將帶你從函數式思維的新角度處理這些任務。
    本書使用了一個長時間運行的示例來說明FP如何在編寫LOB應用程序時提供幫助。為此,我為虛構的Bank of Codeland (BOC)選擇了一個在線銀行應用程序,我知道這很無聊,但至少它有了必需的三個字母的縮寫。因為大多數人都可以使用在線銀行工具,所以很容易想像其所需的功能,並明白所討論的問題與現實應用程序的相關性。
    本書使用其他幾個場景演示如何以函數式風格解決典型的編程問題。在實際例子和FP概念之間來回轉換是為了彌合理論和實踐之間的差距,而這是現有其他文獻所缺乏的。
    利用函數庫
    像C#這樣的語言可能包含一些函數特性,但是為了充分利用這些特性,通常會使用一些庫來促進常見任務的完成。這些庫包括:
    l System.Linq——這是一個函數庫。我假設你是熟悉它的,因為它是.NET的一個重要組成部分。
    l System.Collections.Immutable——這是一個不可變集合庫,第11章將開始使用它。
    l System.Interactive和System.Reactive——這些庫(它們是.NET的交互擴展和響應式擴展)允許處理數據流,詳見第16章和第18章。
    還有很多組成FP的其他重要類型和函數。因此,一些獨立的開發人員編寫了一些庫來填補這些空白。到目前為止,其中最完整的是language-ext,這是由Paul Louth編寫的庫,用於改善C#開發人員的函數式編程體驗。 
    本書沒有直接使用language-ext,而是向你展示我開發函數實用程序庫(名為LaYumba.Functional)的實際過程,盡管它在很大程度上與language-ext重疊。這在教學上更有用,原因如下:
    l 在本書出版後,代碼將保持穩定。
    l 你可以透過現像看本質,看到功能強大的函數結構其實很容易定義。
    l 可以專注於基本要素。我以最純粹的形式展示這些結構,這樣你就不會被完整的庫所解決的細節和邊緣情況分散注意力。
    關於代碼
    這是《C#函數式編程》的第2版,使用了C# 10和.NET 6 。許多(如果不是全部)技術可以應用於該語言的以前版本,但這樣做通常需要一些額外的輸入。附錄中專門說明了如何使用不可變數據和模式匹配(如果使用的是早期版本的C#),而這些語言特性不包括在本書中。
    可掃描本書封底的二維碼,下載本書的源代碼及相關資源。要說明的是,讀者在閱讀本書時會看到一些有關鏈接的編號。形式是數字編碼加方括號,例如[1]表示讀者可掃描封底二維碼下載Links文件,並找到對應章節中[1]所指向的鏈接。
    本書中的代碼清單重點關注的是正在討論的主題,因此可能會省略using語句、名稱空間聲明、簡單的構造函數,或先前代碼清單中出現並保持不變的代碼段。如果你想查看代碼清單的完整編譯版本,可以在代碼存儲庫中找到它。

















     
    網友評論  我們期待著您對此商品發表評論
     
    相關商品
    在線留言 商品價格為新臺幣
    關於我們 送貨時間 安全付款 會員登入 加入會員 我的帳戶 網站聯盟
    DVD 連續劇 Copyright © 2024, Digital 了得網 Co., Ltd.
    返回頂部