
书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:
一、函数式基础
- “函数式编程(FP)的核心原则:纯函数(无副作用)、不可变数据、声明式表达。”
- “C++中实现纯函数:避免修改全局变量或参数,
const
修饰返回值与成员方法。”
二、高阶函数与Lambda
- “高阶函数(Higher-Order Functions)是FP的灵魂:函数作为参数或返回值,如
std::transform
。” - “Lambda表达式
[](){}
的本质是匿名函数对象,捕获列表([=]
/[&]
)决定闭包行为。”
三、不可变性与值语义
- “
constexpr
编译时计算实现不可变(Immutable)数据结构,避免运行时修改。” - “值语义(Value Semantics)优于引用语义:
std::vector
副本独立,而非像Java引用共享。”
四、模板元编程与FP
- “模板元编程(TMP)是编译时FP:
template<typename F>
支持泛型高阶函数。” - “
std::function
统一可调用对象(函数指针、Lambda、bind
结果),类型擦除代价是性能损失。”
五、STL函数式支持
- “STL算法中的FP思想:
std::accumulate
对应fold
,std::bind
实现部分应用(Partial Application)。” - “范围库(Ranges, C++20)的管道操作符
|
启用链式调用,如views::filter(f) | views::transform(g)
。”
六、Monad与错误处理
- “
std::optional
模拟Maybe Monad:显式处理空值,避免nullptr
陷阱。” - “
std::expected
(C++23)扩展optional
,携带错误信息(类似Rust的Result
)。”
七、并发与FP
- “不可变数据天然线程安全:无锁(Lock-free)并发只需关注任务调度。”
- “
std::async
+ Lambda实现并行map
,但需警惕数据竞争(共享状态需同步)。”
八、性能与优化
- “尾递归优化(Tail Recursion)在C++中依赖编译器实现,
[[clang::musttail]]
可强制要求。” - “表达式模板(Expression Templates)延迟计算,避免临时对象开销(如Eigen库矩阵运算)。”
九、设计模式
- “策略模式(Strategy)用
std::function
替代虚函数,运行时替换算法。” - “观察者模式(Observer)借助Lambda简化回调注册,如
subject.on_event([](){...})
。”
十、混合范式建议
- “C++是多范式语言:OOP封装状态 + FP处理逻辑,二者互补而非对立。”
- “FP的终极目标:代码如数学公式般简洁可证,但需平衡性能与抽象成本。”