Roc 语言 List.fold_try 深入解析:从 REPL 快照测试看“遇到第一个 Err 即停止“的折叠语义
Roc 语言 List.fold_try 深入解析从 REPL 快照测试看遇到第一个 Err 即停止的折叠语义【免费下载链接】rocA fast, friendly, functional language.项目地址: https://gitcode.com/GitHub_Trending/ro/rocList.fold_try是 Roc 标准库src/build/roc/Builtin.roc提供的可失败折叠函数它像List.fold一样从左到右遍历列表并逐项更新state但当某一步骤函数返回Err时会立即终止折叠并原样返回该错误而不是继续处理剩余元素。本文以仓库中的 REPL 快照测试 test/snapshots/repl/list_fold_try.md 为骨架结合 Builtin.roc 中的真实实现讲解其类型签名、调用语法、返回值约定、与普通fold的差异以及配套的有副作用变体fold_try!并演示如何用roc repl逐行复现这些行为。读完你不仅能熟练写出正确的fold_try调用还能理解这类短路折叠在错误处理中的典型用法。一、快照文件REPL 行为的可执行说明书先看这份作为本文核心依据的快照文件 test/snapshots/repl/list_fold_try.md它由三个部分组成METAini格式的元信息descriptionList.fold_try folds until the first Err一句话点明了被测语义——折叠直到第一个 Errtyperepl表明这是 REPL 交互快照SOURCE以»为提示符的 REPL 输入行每条都是可直接粘贴进roc repl的表达式OUTPUT与输入一一对应用---分隔的期望输出# PROBLEMS为NIL表示该快照当前无已知问题。快照测试的加载与执行逻辑位于 src/snapshot_tool/main.zig例如其中第 955 行按content.meta.node_type .repl分支处理 REPL 快照roc snapshot --trace-eval 单个_repl_快照.md可用于单条运行。这套机制把行为规范固化成了可回归验证的文本文件。二、四条输入四种视角快照到底验证了什么SOURCE 段共四条语句每条都在验证fold_try的一个侧面» [1, 2, 3].fold_try(0, |sum, n| Ok(sum n)) » [1, 2, 3, 4].fold_try(0, |sum, n| if n 3 { Ok(sum n) } else { Err(Stop) }) » [1.I64, 2, 3].fold_try!(0, |sum, n| Ok(sum n)) » List.fold_try([], 0, |sum, n| Ok(sum n))1. 全成功路径返回Ok(最终状态)» [1, 2, 3].fold_try(0, |sum, n| Ok(sum n)) Ok(6.0)初始state为0逐步累加 1、2、3全程没有失败最终返回Ok(6.0)。注意输出是6.0默认数字字面量是小数fractional这是 Roc REPL 未显式标注类型时的默认数值推断与 test/snapshots/repl/list_fold_simple.md 中[1, 2].fold(0, |acc, n| acc n)输出3.0的观察一致。2. 中途失败短路返回第一个Err» [1, 2, 3, 4].fold_try(0, |sum, n| if n 3 { Ok(sum n) } else { Err(Stop) }) Err(Stop)元素 1、2 通过n 3但当遍历到3时步骤函数返回Err(Stop)折叠立即停止剩余元素4不会被处理最终整体返回Err(Stop)。这正是description中 folds until the first Err 的具体表现。3. 类型标注 副作用变体fold_try!» [1.I64, 2, 3].fold_try!(0, |sum, n| Ok(sum n)) Ok(6)这里用1.I64把列表元素标注为I64因此累加结果是I64输出显示为Ok(6)无小数点。同时它调用的是fold_try!——带!的效果函数effectful变体步骤函数类型为state, item Try(state, err)可在步骤内执行能力capability调用。4. 函数式调用形式 空列表» List.fold_try([], 0, |sum, n| Ok(sum n)) Ok(0.0)两个要点函数式调用List.fold_try(list, initial, step)与管道式list.fold_try(initial, step)等价参数顺序为列表、初始状态、步骤函数空列表边界列表为空时不会调用步骤函数直接返回Ok(初始状态)即Ok(0.0)。三、源码级实现Builtin.roc中的fold_try快照验证的行为正是 src/build/roc/Builtin.roc 中fold_try与fold_try!的实现fold_try : List(item), state, (state, item - Try(state, err)) - Try(state, err) fold_try |list, initial, step| { var $state initial for item in list { $state step($state, item)? } Ok($state) } fold_try! : List(item), state, (state, item Try(state, err)) Try(state, err) fold_try! |list, initial, step!| { var $state initial for item in list { $state step!($state, item)? } Ok($state) }类型签名逐项解读组成部分含义List(item)被折叠的列表元素类型为item多态state初始状态也是每次步骤函数的输入与输出类型(state, item - Try(state, err))步骤函数接收当前state与当前item返回Try(state, err)- Try(state, err)整体返回要么Ok(最终 state)要么Err(err)Try(state, err)即Result(state, err)的别名——要么是携带新状态的Ok要么是携带错误值的Err。核心机制?的短路展开实现的关键是循环体内的$state step($state, item)?其中?是 Roc 的错误传播运算符。fold_try的实现等价于for item in list { $state match step($state, item) { Ok(new_state) - new_state Err(err) - return Err(err) // 立即终止跳过后续元素 } } Ok($state)这正是第二条快照输出Err(Stop)的底层原因一旦某一步返回Err函数立即以该Err结束4不再参与折叠。副作用变体fold_try!fold_try!与fold_try结构完全相同区别在于步骤函数类型是(state, item Try(state, err))使用表示效果函数函数自身签名也用标注为效果函数因此只能在有对应能力capability的上下文中调用循环内调用改为step!($state, item)?。典型场景是把列表元素依次应用到某个有副作用如数据库写入、事件存储的更新函数上文档注释给出了示例events.fold_try!(State.init, |state, event| Store.apply!(state, event))它对每个元素运行步骤函数直到某个返回Err则停止见 Builtin.roc 的注释。四、边界条件与类型细节空列表fold_try对空列表直接返回Ok(initial)快照第 4 条验证了Ok(0.0)数字类型REPL 中未标注的数字默认按小数fractional推断6.0显式标注如1.I64后才得到整数结果6错误类型自由err是类型参数Err(Stop)中Stop是普通标签也可以是任何类型短路语义只要首个Err出现即终止不做收集所有错误式的聚合。五、动手复现在 REPL 中验证全部行为按 README.md 与 BUILDING_FROM_SOURCE.md 构建好roc可执行文件后运行交互式 REPLroc repl逐行粘贴快照 SOURCE 段的四条语句应得到与 OUTPUT 段完全一致的结果输入期望输出验证点[1, 2, 3].fold_try(0, \|sum, n\| Ok(sum n))Ok(6.0)全成功返回Ok(最终状态)[1, 2, 3, 4].fold_try(0, \|sum, n\| if n 3 { Ok(sum n) } else { Err(Stop) })Err(Stop)首个Err短路4被跳过[1.I64, 2, 3].fold_try!(0, \|sum, n\| Ok(sum n))Ok(6)显式类型 效果变体List.fold_try([], 0, \|sum, n\| Ok(sum n))Ok(0.0)函数式调用 空列表需要批量/回归验证时可使用快照工具roc snapshot --trace-eval test/snapshots/repl/list_fold_try.md如果输出与快照不一致测试即失败——这也是 src/snapshot_tool/main.zig 中 REPL 快照分支.repl节点类型所承担的角色把语言行为固化为可持续回归的契约。六、何时使用fold_try与fold/fold_until的取舍函数步骤函数返回终止条件适用场景List.fold普通state遍历完整个列表纯累加、聚合List.fold_untilContinue(state) / Break(state)步骤函数主动返回Break自定义提前终止无错误语义List.fold_tryTry(state, err)步骤函数返回Err或遍历完可失败折叠遇错即停List.fold_try!Try(state, err)效果函数同上带副作用/能力调用的可失败折叠典型场景累计校验一批数据、逐个执行可能失败的操作如批量写入并在首次失败时整体返回错误、或者用fold_try实现短路求值式的遍历。与之配套的还有keep_if_try见 Builtin.roc其实现同样依赖predicate(item)?的短路机制——理解fold_try也就理解了 Roc 中Try与?在遍历场景下的通用组合模式。总结List.fold_try(list, initial, step)返回Try(state, err)全成功得Ok(最终状态)首个Err立即短路并原样返回该错误实现位于 src/build/roc/Builtin.roc核心是循环体内的step($state, item)?错误传播fold_try!是效果函数变体步骤函数可执行带能力capability的副作用调用行为契约由 REPL 快照 test/snapshots/repl/list_fold_try.md 固化可通过roc repl或roc snapshot复现与回归。【免费下载链接】rocA fast, friendly, functional language.项目地址: https://gitcode.com/GitHub_Trending/ro/roc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PyTorch Lightning 生产部署实战:使用 torch.export 导出与运行 LightningModule(进阶指南)

PyTorch Lightning 生产部署实战:使用 torch.export 导出与运行 LightningModule(进阶指南)

PyTorch Lightning 生产部署实战:使用 torch.export 导出与运行 LightningModule(进阶指南) 【免费下载链接】pytorch-lightning Pretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes. 项目地址: htt…

2026/9/22 6:54:07 阅读更多 →
Podman 配置模块加载机制:`--module` 与 Quadlet `ContainersConfModule` 完全指南

Podman 配置模块加载机制:`--module` 与 Quadlet `ContainersConfModule` 完全指南

容器运行时云原生CLI 【免费下载链接】podman Podman: A tool for managing OCI containers and pods. 项目地址: https://gitcode.com/gh_mirrors/po/podman 点击查看 免费下载 导读 本指南围绕 Podman 的配置模块(containers.conf module&#xff09…

2026/9/21 15:17:28 阅读更多 →
NVIDIA显卡驱动与CUDA版本兼容性全解析:从查看、更新到避坑指南

NVIDIA显卡驱动与CUDA版本兼容性全解析:从查看、更新到避坑指南

1. 显卡驱动这件事,远比你想的复杂很多人拿到一张新显卡,第一反应就是去官网点那个最大的“下载驱动”按钮,装完重启,完事。如果你只是打游戏,这套流程确实够用。但只要你开始碰深度学习、视频编解码、3D渲染&#xff…

2026/9/22 3:38:02 阅读更多 →

最新新闻

LTspice变压器仿真:耦合电感建模与参数化扫描实战

LTspice变压器仿真:耦合电感建模与参数化扫描实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:49:15 阅读更多 →
计算机网络课后答案高效利用:从对答案到建错题索引

计算机网络课后答案高效利用:从对答案到建错题索引

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:49:15 阅读更多 →
LTPI协议深度解析:一根LVDS线实现BMC管理信号统一传输

LTPI协议深度解析:一根LVDS线实现BMC管理信号统一传输

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:49:15 阅读更多 →
Win11升级TPM 2.0检测失败?Intel PTT与AMD fTPM开启指南

Win11升级TPM 2.0检测失败?Intel PTT与AMD fTPM开启指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:49:15 阅读更多 →
新能源车企数字化建设方案:从业务蓝图到数据资产落地

新能源车企数字化建设方案:从业务蓝图到数据资产落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:49:15 阅读更多 →
保安员资格考试教材PDF高效备考指南:四周计划与避坑要点

保安员资格考试教材PDF高效备考指南:四周计划与避坑要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:48:14 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →