第三章·函数式岩壁:从值到组合


第三章 · 函数式岩壁:从值到组合

章节摘要:路线从缓坡进入岩壁。函数式编程的核心不是"难懂的术语",而是一件事:用不可变值和纯函数的组合代替可变状态与副作用。本章讲不可变性、函数组合(含 Monad 直觉)与深入模式匹配,为集合库与类型系统主峰提供全部攀爬技巧。

学习目标

  • 解释不可变性如何消灭整类并发与缓存 bug
  • 用 map、flatMap、组合子串联数据处理管线
  • 说出 Monad 的两行定义,并用 Option 亲手实现一遍
  • 用模式匹配 + 密封层级写出编译器保证穷举的分派逻辑
  • 区分偏函数、守卫、解构等匹配素材

核心概念速览

金句:函数式编程 = 值不会变 + 函数可组合;Monad 只是"能 flatMap 的容器"这个工程事实的数学名字。

子章节导航

  • 3.1 不可变性:为什么把状态钉死,共享与并发的收益怎么算。
  • 3.2 函数组合与 Monad 直觉:从 andThen 到 flatMap,Option 手工实现。
  • 3.3 模式匹配深入:密封层级、守卫、解构,编译器兜底的分派。

子章节之间的逻辑关系

三节是一条能力链:不可变提供安全的数据,组合子提供变换的手法,模式匹配提供对结构分派的能力。第四章集合库就是这三者的成品。

[不可变数据] --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 表达"可能没有均值"。整条管线没有一行修改外部状态,输入相同则输出必然相同——这就是函数式岩壁给你换上的新握法。

检查点:翻过岩壁前自测

  • 能解释 map 与 flatMap 的层数差异,并用 for 推导改写一段嵌套 flatMap
  • 能为一个 sealed 层级写出穷尽的 match,并能读懂守卫的执行时机
  • 能说出 val 不等于不可变对象的原因

与后续章节的接缝

本章的 for 推导在第六章会原样套在 Future 上——你已经在 Option 上练过的组合手感直接迁移;模式匹配的 sealed 纪律,在第五章类型类派生与第八章测试框架的断言里反复出现。岩壁上的每一个把手,后面都是长驻装备。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U