类型检查的非空字符串
本文探讨了如何使用Haskell的类型系统来确保字符串在编译时非空,避免运行时的空字符串检查。通过定义自定义类型和利用类型级别的约束,开发者可以在编译阶段就能捕获空字符串错误,从而提高代码的健壮性和安全性。这种方法体现了函数式编程中"使非法状态不可表示"的设计理念。
背景速读
- 本文来自 Bellroy(澳洲钱包品牌)的技术博客,讨论一种用 Haskell 类型系统“强制”字符串不能为空的方法。作者是 Hjort 团队成员,该项目是 Bellroy 用 Haskell 重写核心系统的内部尝试。
- 核心概念是 **Smart Constructor**(智能构造器):不直接暴露数据类型的构造器,而是提供一个函数,在运行时检查输入是否合法(例如非空),若合法则返回带类型标记的值,否则返回错误。这样非法状态在编译阶段就能被排除。
- 文章具体演示了用 `NonEmptyText` 新类型(newtype)配合 `mkNonEmptyText` 构造器,以及如何使用 `refined` 库自动生成这类约束。`NonEmpty` 是 Haskell 标准库中已有的非空列表类型,但作者处理的是文本而非列表。
- 这类技巧在 Rust、Swift、TypeScript(opaque/branded types)等语言中也有类似实践,是“用类型驱动设计”思想的体现:让非法数据无法被表达。