fold 投影(fold / Projection)
fold 投影(fold / Projection)
一句话
定义"如何从一条事件日志算出一个视图"的纯函数就是 fold;算出来的那个视图就是投影(Projection)。
拆开讲
- fold(折叠/规约):把一条条事件累积成一个结果。输入 = 全部事件,输出 = 一个派生状态,纯函数、无副作用。
- 投影(Projection):fold 得到的视图,如"当前对话消息列表"“Goal 状态"“会话标题”,每种都是一份投影。
核心哲学
事件日志(唯一真相 Source of Truth)
├─ fold → 投影A(消息列表)
├─ fold → 投影B(Goal 状态)
└─ fold → 投影C(会话标题)在 Dsh-Go 中
1proj := session.FoldAll(sl.Events())
2for _, m := range proj.Messages {
3 fmt.Printf("[%s] %s\n", m.Role, m.Content)
4}FoldAll把整个日志折叠成SessionProjection(内含Messages/Goal/Todo/PlanMode子投影)- 增量 fold(H04):不是每次读都重算,而是 O(N) 增量维护
性能数据
⚡
增量 fold 相对暴力重算:16.9s → 4.9ms,≈ 3437×(10k 事件,每步读)
对照源码
pkg/session/fold.go—— 投影函数族pkg/session/incremental.go—— 增量投影(H04)- 可运行示例:
examples/tutorial第 2 步
下一步
→ 学习 Goal 状态机:Agent 如何规划并驱动执行