第 5 章:自定义数据类型
假设程序要记录来客信息:可能暂时没有人,也可能有一位已经登记姓名的来客。用空字符串表示“没有人”容易产生歧义。更明确的做法是定义一个类型,直接列出这两种情况。
声明类型和构造器
「来客」立「元类型」也。
「无客」立「来客」也。
「有客」立化「字符串」而「来客」也。
第一行创建类型 「来客」。「元类型」 是类型本身所属的类型;这里先记住这个声明形式即可。
后两行定义构造器,也就是创建这种类型的值的方法。「无客」 不需要参数,本身就是一个来客值。「有客」 接收姓名字符串,例如 「有客」于『小林』,得到另一个来客值。
『小林』 的类型是字符串,「有客」于『小林』 的类型是来客。构造器把姓名包装进来客信息中,两者不能直接互换。
完整程序:根据来客信息生成问候语
寻观「标准库」之书。
「来客」立「元类型」也。
「无客」立「来客」也。
「有客」立化「字符串」而「来客」也。
「问候语」乃化「来客」而「字符串」也。
「问候语」者会「客」而
鉴「客」而
有「无客」则『暂时没有来客。』
或有(「有客」于「姓名」)则
「字符串拼接」于『你好,』于「姓名」也。
「打印行」于(「问候语」于(「有客」于『小林』))。
「打印行」于(「问候语」于「无客」)。
输出为:
你好,小林
暂时没有来客。
鉴 根据来客的构造器选择分支。遇到 「无客」,直接返回说明文字;遇到 「有客」,取出里面的姓名,再拼接问候语。下一章会详细介绍这种同时判断和取值的写法。
什么时候只需要类型别名
如果只是想给现有类型另起一个名称,可以使用:
「计数」即「整数」也。
「计数」 和 「整数」 仍然是同一个类型,整数不需要经过转换就能用于计数。别名适合缩短复杂类型的写法;如果需要表达新的数据情况,使用 立 和构造器。
练习
定义 「季节」 类型,声明春、夏、秋、冬四个不带参数的构造器,再写一个函数把它们转换成字符串。每个构造器都调用一次,检查是否都有对应结果。这个例子不需要携带额外数据,与有姓名的来客比较一下。
上一章 · 下一章:模式匹配与对子 · 目录