
【免费下载链接】rocA fast, friendly, functional language.项目地址https://gitcode.com/GitHub_Trending/ro/roc点击查看免费下载本篇技术指南围绕 Roc 仓库中 test/snapshots/repl/try_collapse.md 这一 REPL 快照测试展开讲解内置Try类型中Try.collapse函数的语义、使用场景与底层实现并结合 src/build/roc/Builtin.roc 的源码定义与相关 REPL 快照测试进行交叉印证。读完本文你将掌握Try.collapse的调用方式、它与Try.catch/map_both的异同以及如何通过roc repl在交互环境中直接验证其行为。一、快照测试是什么try_collapse.md 的结构解读test/snapshots/repl/try_collapse.md是 Roc 编译器测试体系中的一份 REPL 快照snapshot文件它由四段固定结构组成段作用# META元信息块声明测试描述与类型descriptionTry.collapse on Ok and Err holding the same type说明本测试主题是对持有相同类型的 Ok 与 Err 调用 Try.collapsetyperepl表示这是一个 REPL 会话测试# SOURCE输入到roc repl的逐行源码行首»是 REPL 提示符# OUTPUT与 SOURCE 逐段对应的期望输出段与段之间用---分隔# PROBLEMS期望的编译/类型错误列表此处为NIL表示所有输入均通过类型检查、无任何诊断这类快照文件是 REPL 测试的黄金标准# OUTPUT中记录的每一行都是测试运行前人工核对过的真实输出任何 REPL 行为变化都会导致快照比对失败从而保护交互式会话的输出稳定性。本次快照的元描述明确点出核心前提——Ok 与 Err 持有相同的类型这正是Try.collapse能够成立的根本条件。二、核心语义Try.collapse 做什么Try.collapse用于将两个分支持有相同类型的Try值折叠collapse为一个普通值无论该Try当前是Ok还是Err都直接取出其中装载的值返回。源码 src/build/roc/Builtin.roc 中给出了权威定义与文档注释## Returns whichever value this result holds, for a result whose Ok and Err ## hold the same type. This is [Try.catch] with two identity functions. ## roc ## expect Try.Ok(5.I64).collapse() 5 ## ## expect Try.Err(7.I64).collapse() 7 ## collapse : Try(a, a) - a collapse |try| match try { Err(a) a Ok(a) a }三点关键信息类型签名Try(a, a) - aOk与Err必须持有同一类型a这是调用前提也是本文快照标题中 holding the same type 的由来实现即模式匹配match try后两个分支都原样返回内部值a等价于对Try.catch传入两个恒等函数identity function的简写可读作把结果剥壳结果值不再包裹在Ok/Err标签中直接以裸值形式返回。与 Try.catch 的关系同一文件中紧邻的Try.catchsrc/build/roc/Builtin.roc签名是Try(ok, err), (err - a), (ok - a) - a允许Ok、Err分别用不同函数变换后再合并为同一类型a。Try.collapse正是Try.catch的退化特例——两个变换函数均为恒等函数故源码注释直接写为 This isTry.catchwith two identity functions。两者使用对比# catchOk 与 Err 分别变换再归并为同一类型 Try.Ok(12.I64).catch(|_| 0, |n| n * 2) # 24 Try.Err(uh oh).catch(|_| 0, |n| n * 2) # 0Err 分支 # collapse两侧类型必须一致直接取内层值 Try.Ok(5.I64).collapse() # 5 Try.Err(7.I64).collapse() # 7三、快照逐行推演四段输入与对应输出test/snapshots/repl/try_collapse.md的# SOURCE共有四条输入# OUTPUT给出四段对应结果下面逐条分析。第 1 条Try.collapse(Try.Ok(5))→5.0对Ok(5)调用折叠输出5.0。注意数字带小数点.0这与 docs/langref/numbers.md 中描述的数字字面量默认类型为Dec一致——REPL 中没有额外类型约束时整数常量 5 被推断为Dec并以5.0呈现。第 2 条Try.collapse(Try.Err(7))→7.0Err(7)同样被折叠为裸值7.0。这验证了核心语义Err分支中装载的值会被原样取出而不是被当作错误传播或丢弃。在Ok/Err同类型的前提下错误分支的载荷与成功分支地位对等。第 3 条t Try.Ok(a string long enough to be heap-allocated instead of stored inline)→assigned \t这是一条变量绑定语句REPL 输出assigned \t表示绑定成功。字符串内容特意选择了足够长、需要在堆上分配heap-allocated而不是内联存储stored inline的文本——这提示快照测试有意覆盖**非小型值**场景验证Try.collapse 对堆分配字符串同样正确地把值取出且不涉及任何复制或转换。第 4 条Try.collapse(t)→ 输出该字符串本身对已绑定的t调用Try.collapse直接得到裸字符串值不带Ok(...)包装证明折叠对已绑定变量同样生效。第 5 条t→Ok(a string long enough to be heap-allocated instead of stored inline)最后直接求值变量tREPL 显示其原始形态Ok(...)——折叠操作是非破坏性的Try.collapse只是取出了值原变量t仍是完整的Ok(...)包装未被修改。这五步构成一个完整的验证闭环两条字面量用例证明Ok/Err两侧行为一致堆分配字符串用例证明对非内联值同样正确最后一步证明原值不被破坏。四、REPL 交互验证如何亲手复现Roc 提供交互式解释器无需创建文件即可实验表达式与定义。在项目根目录启动roc repl然后逐行输入快照中的内容即可复现» Try.collapse(Try.Ok(5)) 5.0 » Try.collapse(Try.Err(7)) 7.0 » t Try.Ok(a string long enough to be heap-allocated instead of stored inline) assigned t » Try.collapse(t) a string long enough to be heap-allocated instead of stored inline » t Ok(a string long enough to be heap-allocated instead of stored inline)docs/mini-tutorial-new-compiler.md亦给出了 REPL 的另一种用法将源码通过管道喂入例如(x 1 1, x * 2) | roc repl适合批量验证。若你想修改后重跑整个快照可编辑 SOURCE 后重新启动roc repl输入本仓库为只读快照文件仅用于阅读与对照。五、Try 家族与 collapse 的适用边界Try是 Roc 内置的结果类型Try(ok, err)提供Ok与Err两个构造器。围绕它src/build/roc/Builtin.roc 定义了一整套操作函数理解collapse在其中的位置有助于把握适用边界函数签名要点与 collapse 的区别Try.map_okTry(a, err), (a - b) - Try(b, err)只变换 Ok结果仍是TryTry.map_errTry(ok, b), (b - c) - Try(ok, c)只变换 Err结果仍是TryTry.map_bothTry(a, b), (a - c), (b - d) - Try(c, d)两侧可变换为不同类型结果仍是TryTry.catchTry(ok, err), (err - a), (ok - a) - a两侧变换为同一类型结果为裸值Try.collapseTry(a, a) - a两侧类型相同且恒等取出结果为裸值从源码结构看map_*系列保留结果包装以便继续链式组合catch与collapse则负责终结链条、把结果还原为普通值。collapse只在Ok与Err载荷类型完全一致时可用——类型系统会在编译期强制这一约束若两侧类型不同编译器将给出类型错误本快照# PROBLEMS为NIL即当前用例全部合法。典型适用场景可以推断为某种操作失败值与成功值属于同一类型例如查找可能返回空集合、取默认值但默认值本身也可能不存在等此时错误分支不再需要区分对待直接折叠即可。与此互补的是??操作符见 test/snapshots/repl/double_question_ok.md、test/snapshots/repl/double_question_err.md、test/snapshots/repl/double_question_chained.md 等快照它用于在Err时提供回退值而Try.collapse则是在两种分支值无需区分的场景下直接展开二者从不同角度消化错误路径。六、从快照到实现测试如何守护这一语义Roc 的 REPL 快照测试是回归保护的重要一环。# OUTPUT中的期望输出如5.0、assigned \t、裸字符串必须与 REPL 实际输出逐字节一致任何改变输出格式、包装方式或值展示逻辑的改动都会触发快照失败从而防止Try.collapse的语义被无意破坏。同时# PROBLEMS: NIL守卫了类型约束——若未来实现放宽或收紧Try(a, a) 的同类型要求该字段会相应变化并被测试捕获。此外Try的辅助判定函数 Try.is_ok 与 Try.is_err 也提供了先判断分支、再决定是否折叠的编程模式而Try.Ok/Try.Err构造器在标准库中被广泛使用例如列表操作的List.get、List.first等在越界/空列表时返回Err参见 src/build/roc/Builtin.roc。当这类错误的载荷类型恰与成功值类型一致时Try.collapse就是最简的收敛手段。小结Try.collapse : Try(a, a) - a要求Ok/Err持有相同类型实现为对Try.catch传入两个恒等函数快照 test/snapshots/repl/try_collapse.md 用 5 条输入完整覆盖了字面量、变量绑定、堆分配字符串与原值不被破坏四种情形在roc repl中可直接复现全部输出Dec字面量默认带.0后缀当错误载荷与成功值类型一致、且无需区分分支时Try.collapse是结束Try链的最简方式若两侧类型不同应改用Try.catch归并。赞分享【免费下载链接】rocA fast, friendly, functional language.项目地址https://gitcode.com/GitHub_Trending/ro/roc点击查看免费下载相关推荐Roc 语言 Try.map_both 实战从 REPL 快照测试看懂 Ok/Err 双分支映射语义Roc 语言 Try.map_both 实战从 REPL 快照测试看懂 Ok/Err 双分支映射语义 本篇技术指南以 Roc 仓库中的 REPL 快照测试 t3个技巧让Layerdivider成为你的AI分层魔法师3个技巧让Layerdivider成为你的AI分层魔法师 你是否曾面对一张精美的插画却苦于无法轻松分离其中的元素Layerdivider正是那个能将复杂图像Roc 语言 List.fold_try 深入解析从 REPL 快照测试看遇到第一个 Err 即停止的折叠语义Roc 语言 List.fold_try 深入解析从 REPL 快照测试看遇到第一个 Err 即停止的折叠语义 List.fold_try 是 Roc 标上一篇从论文到实践MT3双模型技术对比ISMIR 2021 vs ICLR 2022下一篇如何快速掌握Guns定时任务管理实现自动化运维与业务处理的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考