Lobsters | 📄 原文链接 | 2026-10-28 收录

TypeScript 一行搞定的联合类型,Haskell 要绕多远

来源:garciat.com — 2026-10

📋 概述

作者喜欢 TypeScript 的联合类型(匿名和类型)与字面量类型(单例类型)的组合:配合判别字段,可以既精确又简短地表达"成功时带角色与头像尺寸、失败时带错误信息"这种 API。换成不开扩展的 Haskell,就得为 UserRole 与 AvatarSize 各写一个 ADT,真实取值 96、128、512 被 AvatarSize96 这类标签遮住。于是他试了两条扩展路线:DataKinds + GADTs 的 OneOfNat,用嵌套的 Here/There 承载类型级自然数,能跑但语法是嵌套的;DataKinds + UnboxedSums 的 (# SNat 96 | SNat 128 | SNat 512 #),语法扁平好看,但每种元数的 unpacked sum 是不同的 kind,导致无法用类型族对元数做抽象(GHC 会报 kind 不匹配)。他还点出更根本的差距:两条路都不具备"联合类型像集合那样去重"的语义,改用类型级 Set 只会让表示更复杂。

🔑 核心要点

💡 金句

而且,这两种替代方案都没有达到我们想要的语义——让类型联合像一组类型那样行为,也就是把重复项归一。
← 返回 Lobsters 首页