跳到正文豫言教程

第 5 章:自定义数据类型

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

声明类型和构造器

「来客」立「类」也。
「无客」立「来客」也。
「有客」立化「文」而「来客」也。

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

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

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

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

寻观「豫章」之书。

「来客」立「类」也。
 「无客」立「来客」也。
 「有客」立化「文」为「来客」者也。

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

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

输出为:

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

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

什么时候只需要类型别名

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

「计数」即「数」也。

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

练习

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

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