The Unreasonable Effectiveness of Constructive Data Modeling

Lobsters Hottest 事件

摘要

本文通过将类型视为构造新值的正空间而非限制值的负空间,结合积类型和和类型,可以精确建模数据的不变量,避免与类型检查器的斗争。建议使用简单类型组合而不是复杂类型系统特性。

<p><a href="https://lobste.rs/s/vptzoz/unreasonable_effectiveness">Comments</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/27 21:49

TL;DR: 通过将类型视为构造新值的正空间而非限制已有值的负空间,并合理使用积类型和和类型,可以在不需要复杂类型系统特性的情况下精确建模数据的不变量,从而避免与类型检查器的斗争。 ## 从静态类型的黑暗时代到复兴 演讲者最初在 Haskell 编译器上工作,后来在 August Health 用 Scala 为养老院开发护理软件。软件涉及药物管理,错误可能导致严重后果,因此团队非常重视正确性,大量使用测试和静态类型。 早期静态类型的主流语言是 Java 和 C++。Java 保守、限制性强,与面向对象紧密绑定;C++ 复杂且不关注安全。这导致许多程序员认为静态类型过时,转而拥抱 JavaScript 和 Ruby 等动态语言。近年来,Rust 和 TypeScript 带来了静态类型的复兴——Rust 强调安全,TypeScript 为 JavaScript 添加类型。这些都让静态类型重新变得“酷”。 ## 类型系统复杂度的两难 然而,演讲者并不满意现状。类型系统的复杂度增长过快,多数 TypeScript 程序员不理解其工作原理,常与类型检查器“斗争”。Java 因过于限制而令人沮丧,TypeScript 因过于复杂而令人沮丧。许多人以为必须使用花哨的特性(如依赖类型)才能解决问题。但演讲者认为,通过一个视角转换,使用简单的积类型和和类型就能有效捕捉不变量,且适用于多数支持这些特性的语言。 ## 核心思想:类型是构造而不是限制 ### 负空间 vs 正空间 通常人们认为类型是限制:在 `unknown` 宇宙中画小圆圈,排除不想要的值。但 Java 的类定义不仅限制已有值,还引入新的一类运行时值(如 `Point` 结构体)。因此,类型可以看作是从无到有地构造正空间。 以自然数为例:如果只能用有符号整数表示非负整数,你会希望限制值集,但细化类型很难实现。如果先定义只包含所需值的无符号整数类型(正空间),然后向上扩展就简单了。 ### 非空列表与偶数列表 - **非空列表**:由“一个元素”和“零个或多个元素”组成。用元组表示即可,无需复杂类型特性。 - **偶数个元素的列表**:元素成对出现,可表示为 `pair 的列表`。虽然对列表的操作需要适配,但只要解耦数据的表示与解释,就能灵活建模。 ### 用户示例:邮箱或电话至少有一个 假设数据库中有用户结构体,含有邮箱和电话字段,至少有一个必须设置。容易想到需要依赖类型(“邮箱”的类型依赖于“电话”的值)。但通过引入额外的枚举类型明确所有可能状态,问题迎刃而解: ```plaintext type ContactMethod = | Email(string) | Phone(string) | Both(email: string, phone: string) ``` 这样类型系统就能强制至少有一个联系方式。如果未来需要增加新状态(如无联系方式),只需添加新的变体。 ## 总结与视角转换 关键是从“类型即限制”转向“类型即构造”。多数语言提供积类型(记录、元组)和和类型(枚举、联合、代数数据类型),配合穷尽模式匹配,就能精确建模数据的不变量。不必追求过于复杂的类型系统特性,而是思考如何用简单的组合构造出所需的正空间。这种做法能让程序员重新掌控类型系统,减少与检查器的斗争。 --- Source: [YouTube: The Unreasonable Effectiveness of Constructive Data Modeling](https://www.youtube.com/watch?v=0BXuYlNrUmE)

相似文章

Typst: Designing for Incrementality

Lobsters Hottest

Typst 通过约束记忆化(comemo)和纯函数设计,使语言和编译器协同工作,实现高效的增量编译和实时预览。文章详细介绍了布局缓存、模块评估记忆化、函数纯度以及内省系统的设计思路。

@Phoenixyin13: 这篇来自Meta FAIR的最新重磅论文,旨在告诉AI行业一句重要的风向标: “大模型数据,正在迎来智能科学家时代。” 在这篇论文里, 一个经过 Autodata 精准洗礼的 4B小模型,在法律推理任务上,不仅碾压了传统合成数据训练出来的…

X AI KOLs Timeline

Meta FAIR最新论文提出Autodata方法,通过智能数据科学家Agent自主生成和优化高质量数据,使4B小模型在法律推理任务上击败397B大模型,预示数据质量可弥补参数量鸿沟,为数据pipeline和scaling提供新思路。

结构正确性

Hacker News Top

一篇技术博客文章,讨论类型系统和构建系统等结构描述如何利用图结构模型来确保正确性,并强调像Bazel这样的系统的定义性本质。

Data types à la carte (2008)

Lobsters Hottest

本文提出了一种从独立组件组合数据类型和函数的技术,并将该方法扩展到结合自由单子,从而实现了对Haskell的IO单子的模块化结构。