第 6 章:模式匹配与对子

上一章用 区分“无客”和“有客”,还从有客的值中取出了姓名。这种操作叫模式匹配:描述你想处理的数据形式,并给其中的部分起名字。

模式中的名称从哪里来

回看上一章的一个分支:

或有(「有客」于「姓名」)则
    「字符串拼接」于『你好,』于「姓名」

这里的 「有客」 是已经声明的构造器,而 「姓名」 是这个模式新引入的局部名称。匹配 「有客」于『小林』 时,它绑定到字符串 『小林』。这个名称只在该分支的结果表达式中使用。

模式里的 描述数据的构造形式,并不是在这里再调用一次构造器。

把两个值放在一起

需要一起返回或传递两个值时,可以使用“对子”。 构造对子, 描述对子类型:

「五」与「八」
「整数」合「整数」

第一行是一个值,第二行是它的类型。两个位置也可以使用不同类型,例如姓名和年龄可以组成 「字符串」合「整数」

下面是取出两个整数并相加的完整程序:

寻观「标准库」之书。

「对子求和」乃化(「整数」合「整数」)而「整数」也。
「对子求和」者会「对子」而
    鉴「对子」而
        有(「左」与「右」)则「加」于「左」于「右」也。

「打印行」于(「整数表示」于(「对子求和」于(「五」与「八」)))。

输出为 13。模式 「左」与「右」 把第一个值绑定到左,第二个值绑定到右。这里只有一种需要拆解的形式,所以只写一个分支。

只取一个位置

若已有名为 「对子」 的值,可以按位置取值:

「对子」中「零」
「对子」中「一」

位置从零开始。上面的对子中,位置零是 5,位置一是 8。只取一个位置时这种写法很直接;需要同时使用两部分时,模式匹配能为它们提供更有意义的名称。

处理剩下的情况

对于有多个构造器的类型,应考虑每一种情况。也可以在最后用普通名称接住剩余值,例如下面是一个分支片段:

或有「其他」则『未分类』

它会匹配前面没有处理的值。如果每种情况本来就该有不同处理方式,逐一列出构造器更容易检查遗漏。

练习

先写一个只处理整数对子的 「交换」 函数,把 5 与 8 变成 8 与 5。分别打印结果的位置零和位置一,应得到 8、5。下一步可把输入改成字符串与整数的对子,同时修改返回类型,观察两个位置的类型如何交换。

上一章 · 下一章:列表与递归处理 · 目录