深入解析 Unison 的类型声明:结构类型、唯一类型与不透明类型的演进之路
编程语言编译器语言运行时开发工具【免费下载链接】unisonA friendly programming language from the future项目地址https://gitcode.com/gh_mirrors/un/unison点击查看免费下载导读docs/type-declarations.markdown是 Unison 语言设计早期标记为 draft的一份核心设计文档它系统性地讨论了三种数据类型声明形态——结构类型Structural Types、唯一类型Unique Types与不透明类型Opaque Types——各自的身份identity定义方式、构造子唯一性约束、模块化封装能力以及三者之间的组合可能性。本文以该文档为主线结合当前仓库中的 DataDeclaration 实现、V2 哈希实现 与词法器源码还原这些设计决策的来龙去脉并对照>data DataDeclaration v a DataDeclaration { annotation :: a, bound :: [v], constructors :: [(a, v, AnnotatedType v a)] -- isStructural :: IsStructural -- isOpaque :: Set (AnnotatedTerm v a) } deriving (Eq, Show, Functor) -- type IsStructural Structural | Unique GUID这段草稿代码与当前仓库中的最终实现高度对应。在 unison-core/src/Unison/DataDeclaration.hs#L115-L121 中DataDeclaration已被整理为data DataDeclaration v a DataDeclaration { modifier :: Modifier, annotation :: a, bound :: [v], constructors :: [(a, v, Type v a)] } deriving (Eq, Ord, Show, Functor, Generic)草稿中被注释掉的isStructural :: IsStructural与isOpaque :: Set (AnnotatedTerm v a)正是对类型身份由什么决定这一核心问题的探索痕迹最终它们收敛为一个独立的Modifier代数数据类型data Modifier Structural | Unique Text -- | Opaque (Set Reference) deriving (Eq, Ord, Show)在 V2 哈希模块 中Modifier的定义与之一致而注释中的Opaque (Set Reference)也原样保留——这说明不透明类型在当时仍是悬而未决的候选方案尚未进入最终的类型系统。从源码结构可以推断Opaque 在正式实现中并未落地Unique 则通过 GUIDText实现Structural 成为默认形态。类型身份为什么如此重要文档虽然没有长篇展开背景但配套文档>structural type Maybe a Nothing | Just a structural type Optional t Some t | None由于结构类型的身份完全由构造子的结构签名决定Maybe与Optional是同一个类型。更进一步structural type Validation e a Success a | Failure e structural type Either a b Left a | Right b即使语义上并不应该等同Validation与Either的语义差异明显它们仍然会因结构相同而互通——文档指出这也许本不该如此属于设计上需要接受的现实。配套文档>unique type Day Mon | Tue | Wed | ... unique[guid] type Day Mon | Tue | Wed | ...从解析器源码可以印证 GUID 的两种来源路径Parser.hs#L200-L204 中解析环境带有一个uniqueTypeGuid :: Name - m (Maybe Text)回调——每当遇到未显式指定 GUID 的unique type声明时先按名字查询是否已有可复用的 GUIDJust则复用否则调用uniqueName 32生成一个 32 字符的 base32hex 随机标识。这与文档中GUID 通常自动生成、但可显式指定以复用相同类型的设计完全吻合。构造子的有序性问题文档给出了一个在当时仍未敲定的细节Order of constructors having the same type is stable, but the relative constructor order of differently typed constructors is (currently) unspecified.即同类型构造子之间的相对顺序是稳定的而不同类型构造子的相对顺序当时未定义。对比>opaque type Socket Socket Nat opaque type Handle Handle Text文档随即抛出两个尚待解答的问题如何声明一个能检查两种不透明类型的定义我们自己语言实现者如何创建和检查 Socket不想公开访问器但又需要某种方式让特权代码构造这些值——单构造子类型较简单多构造子情形可能需要一种确定性的区分方式。与 Scala 不透明类型的对比文档引用了 Scala SIPopaque types作为参照并记录了三点观察Scala 的不透明类型本质上是类型别名无装箱只在对应的伴生对象/模块内部相等Unison 则需要把值装箱进构造子以获得与类型身份对应的哈希因此两者在实现机制上存在本质差异。另一种思路friend 注解与私有函数文档随后记录了一条来自社区讨论的替代方案线索指向 2019 年的 Slack 讨论文内附有链接与其强制改变类型身份才能添加特权函数这有违开放世界精神不如让不透明类型的身份完全等同唯一类型再额外允许将某些项标注为某类型的friend从而获准创建/模式匹配其值。草案给出如下语法friend[Foo, Bar] eg : Foo Bar eg Foo.Foo 1 hi (Bar.Bar 3.1) -- syntax reminiscent of unique[#af361]这种注解是挂在项上的元数据语言可以提供列出某个类型的所有 friend的能力以评估特权代码的足迹footprint。在此基础上文档进一步提出private[Foo]注解它既蕴含friend[Foo]又限定只能被其他friend[Foo]项引用。理由是仅靠控制创建 模式匹配并不足以覆盖前述三个模块化目标——库内部的辅助函数仍可能被以破坏不变量的方式调用或将来被改动/移除或与 API 不在同一语义层级。实现现状Opaque 未落地需要如实指出从当前仓库源码看不透明类型并未作为独立语言特性实现。Modifier中Opaque (Set Reference)仅存在于注释里见 unison-core/src/Unison/DataDeclaration.hs#L105 与 unison-hashing-v2/src/Unison/Hashing/V2/DataDeclaration.hs#L29。仓库中opaque字样多数指向运行时内部的Canonicalizer值如 unison-runtime/src/Unison/Runtime/Canonicalizer.hs#L114与语言层面不透明数据类型是两回事。内置类型如MVar的伪不透明是通过Reference.Builtin机制实现的详见 adding-builtins.markdown 中对builtinTypesSrc与B MVar CT.Data的说明——那是另一条实现路径内置引用 名称合并而非用户级的不透明类型语法。组合规则哪些形态可以叠加文档用一张简明的表回答了组合问题组合结论说明Structural Unique否身份机制互斥Structural Opaque否身份机制互斥Unique Opaque可以Opaque 隐含 Unique由此得到关键推论Opaque 蕴含 Unique。文档给出的判别用例极具指导性需要Opaque 但不需 Unique的场景SortedSet——其语义完全由暴露的方法定义两个实现相同方法的集合类型可以视为同一类型需要Unique Opaque的场景Socket、Handle——暴露的方法决定了这两个类型必须保持不同身份即使内部表示相同。这一组合矩阵与Modifier Structural | Unique Text的最终落地形态一致一旦 Opaque 落地它必然建立在 Unique 之上。遗留的设计讨论构造子顺序与代数类型构造子显示顺序应作为可编辑元数据文档记录了一个真实场景一位开发者为了可读性把IsOptional类型的构造子从Optional / Required / ZeroPlus / OnePlus调整为Optional / Required / ZeroPlus / OnePlusRequired 提前但语义完全没变仍希望这是同一个类型——而当时提出的所有类型实现都无法做到这一点。作者Paul Chiusanopchiusano的回应是构造子显示顺序应作为附着在类型声明上的元数据允许被编辑add/update命令在默认情况下甚至可以针对这类修改建议元数据编辑。这个讨论最终如何收场可以参考>赞分享编程语言编译器语言运行时开发工具【免费下载链接】unisonA friendly programming language from the future项目地址https://gitcode.com/gh_mirrors/un/unison点击查看免费下载相关推荐Roc 编译器局部类型声明详解块级作用域的类型别名、名义类型与不透明类型Roc 编译器局部类型声明详解块级作用域的类型别名、名义类型与不透明类型 本文基于 roc 语言仓库中的编译快照测试 test/snapshots/type_PHP-Parser类型处理类型声明解析支持PHP Parser类型处理类型声明解析支持 引言现代PHP类型系统的演进 随着PHP语言的不断发展类型系统经历了从弱类型到强类型的重大变革。从PHP 7编译器静态分析代码生成zotero-style类型定义global.d.ts全局类型声明深度解析还在为Zotero插件开发中的类型错误烦恼吗一文带你彻底掌握zotero style的全局类型系统让你的开发效率提升200% 全局类型架构全景 zoter桌面应用知识管理科研上一篇BiSheng ReBAC 列表性能优化实战Cursor 分页 无限滚动改造全解析F027下一篇如何快速上手Laravel-api-generator5分钟搭建RESTful API的实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Typora配PicGo插件:自动按日期和文章名归类图片

Typora配PicGo插件:自动按日期和文章名归类图片

用 Typora 写 Markdown,最让我崩溃的从来不是排版,而是图片管理。我写过一篇两万字的实践笔记,光截图就插了 80 多张,传到图床之后,文件名全变成20250413_103201.png这种毫无信息量的时间戳,三个月后再想找…

2026/11/5 18:33:04 阅读更多 →
Superpowers:用技能包为AI装上模块化外骨骼

Superpowers:用技能包为AI装上模块化外骨骼

1. 什么是 Superpowers:一次解决“AI 不够聪明”的笨办法大概每个重度使用 AI 助手的人,都经历过同一种挫败:模型明明很聪明,但你让它把一份 PDF 合同里的关键条款抽出来,它却给你一段泛泛而谈的摘要;你让它…

2026/11/4 23:52:03 阅读更多 →
Build-Time Targeting 示例:基于自定义特征的静态变体生成与边缘渲染

Build-Time Targeting 示例:基于自定义特征的静态变体生成与边缘渲染

低代码前端后端 【免费下载链接】plasmic Visual builder for React. Build apps, websites, and content. Integrate with your codebase. 项目地址: https://gitcode.com/gh_mirrors/pl/plasmic 点击查看 免费下载 本示例基于 Next.js Pages Router 与 plasmicap…

2026/11/4 9:24:36 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/8 1:19:03 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/7 12:08:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/8 1:35:05 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/8 1:38:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/7 12:08:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/8 1:23:14 阅读更多 →

日新闻

周新闻

月新闻