Haskell 中的带标签数据(SICP 2.4.2)
本文探讨了《计算机程序的构造和解释》(SICP)中关于通过标签支持数据多表示的内容。作者用 Haskell 语言复现了 SICP 的经典解法,展示了如何处理复数在直角坐标和极坐标两种形式下的存储与操作。通过引入标签机制,不同开发者可以各自选择不同的数据表示方式而无需达成一致。
背景速读
- SICP (《计算机程序的构造和解释》) 是 MIT 经典的计算机科学教材,因其封面设计常被称为"魔法书"。本文讨论的是该书 2.4.2 节的内容。
- 文章用 Haskell 语言重述 SICP 中的一个核心问题:当两个程序员为复数选择了不同的内部表示(直角坐标 vs. 极坐标),如何通过"数据标签"让代码同时兼容两种表示,而不用统一格式。
- 标签化数据(tagged data)是一种在动态类型环境下实现"多态数据"的经典手段:给数据加上类型标记,再通过分派函数根据标记选择对应的操作。Haskell 本以静态类型著称,作者刻意模仿 SICP 原书 Lisp 的动态风格来演示这一技术。
- 复数有两种常见数学表示:直角坐标(实部+虚部)适合加减法,极坐标(模+辐角)适合乘除法。能同时支持两者的关键在于操作函数根据标签自行切换。