章节摘要:路线从缓坡进入岩壁。函数式编程的核心不是"难懂的术语",而是一件事:用不可变值和纯函数的组合代替可变状态与副作用。本章讲不可变性、函数组合(含 Monad 直觉)与深入模式匹配,为集合库与类型系统主峰提供全部攀爬技巧。
金句:函数式编程 = 值不会变 + 函数可组合;Monad 只是"能 flatMap 的容器"这个工程事实的数学名字。
三节是一条能力链:不可变提供安全的数据,组合子提供变换的手法,模式匹配提供对结构分派的能力。第四章集合库就是这三者的成品。
[不可变数据] --map/flatMap--> [组合管线] --match--> [结构分派] \________________________________________/ 第四章:集合库全都是这三件事的封装
前置:第一章的函数值。延伸:5.4 类型类将把组合子变成可扩展的接口;6.1 Future 是"时间维度上的 Monad"。
第二章结尾的对象骨架,在本章进一步脱去副作用外衣,变成一条纯函数管线:
def parse(raw: String): Option[Reading] = raw.trim.split(",") match case Array(v, unit) => for d <- v.toDoubleOption s <- unit match case "C" => Some(Celsius) case "F" => Some(Fahrenheit) case _ => None yield Reading(d, s) case _ => None val stats = raws.flatMap(parse).map(_.asCelsius) // 解析失败的行自然消失 val avg = if stats.isEmpty then None else Some(stats.sum / stats.size)
改造的每一步都对应本章一节:parse 内部是模式匹配的分层解构,flatMap 让"解析失败"这个上下文无声地流走,最后聚合返回 Option 表达"可能没有均值"。整条管线没有一行修改外部状态,输入相同则输出必然相同——这就是函数式岩壁给你换上的新握法。
本章的 for 推导在第六章会原样套在 Future 上——你已经在 Option 上练过的组合手感直接迁移;模式匹配的 sealed 纪律,在第五章类型类派生与第八章测试框架的断言里反复出现。岩壁上的每一个把手,后面都是长驻装备。