第 5 章:自定义数据类型

假设程序要记录来客信息:可能暂时没有人,也可能有一位已经登记姓名的来客。用空字符串表示“没有人”容易产生歧义。更明确的做法是定义一个类型,直接列出这两种情况。

声明类型和构造器

「来客」立「元类型」也。
「无客」立「来客」也。
「有客」立化「字符串」而「来客」也。

第一行创建类型 「来客」「元类型」 是类型本身所属的类型;这里先记住这个声明形式即可。

后两行定义构造器,也就是创建这种类型的值的方法。「无客」 不需要参数,本身就是一个来客值。「有客」 接收姓名字符串,例如 「有客」于『小林』,得到另一个来客值。

『小林』 的类型是字符串,「有客」于『小林』 的类型是来客。构造器把姓名包装进来客信息中,两者不能直接互换。

完整程序:根据来客信息生成问候语

寻观「标准库」之书。

「来客」立「元类型」也。
「无客」立「来客」也。
「有客」立化「字符串」而「来客」也。

「问候语」乃化「来客」而「字符串」也。
「问候语」者会「客」而
    鉴「客」而
        有「无客」则『暂时没有来客。』
        或有(「有客」于「姓名」)则
            「字符串拼接」于『你好,』于「姓名」也。

「打印行」于(「问候语」于(「有客」于『小林』))。
「打印行」于(「问候语」于「无客」)。

输出为:

你好,小林
暂时没有来客。

根据来客的构造器选择分支。遇到 「无客」,直接返回说明文字;遇到 「有客」,取出里面的姓名,再拼接问候语。下一章会详细介绍这种同时判断和取值的写法。

什么时候只需要类型别名

如果只是想给现有类型另起一个名称,可以使用:

「计数」即「整数」也。

「计数」「整数」 仍然是同一个类型,整数不需要经过转换就能用于计数。别名适合缩短复杂类型的写法;如果需要表达新的数据情况,使用 和构造器。

练习

定义 「季节」 类型,声明春、夏、秋、冬四个不带参数的构造器,再写一个函数把它们转换成字符串。每个构造器都调用一次,检查是否都有对应结果。这个例子不需要携带额外数据,与有姓名的来客比较一下。

上一章 · 下一章:模式匹配与对子 · 目录