第 6 章:模式匹配与对子
上一章用 鉴 区分“无客”和“有客”,还从有客的值中取出了姓名。这种操作叫模式匹配:描述你想处理的数据形式,并给其中的部分起名字。
模式中的名称从哪里来
回看上一章的一个分支:
或有(「有客」于「姓名」)则
「字符串拼接」于『你好,』于「姓名」
这里的 「有客」 是已经声明的构造器,而 「姓名」 是这个模式新引入的局部名称。匹配 「有客」于『小林』 时,它绑定到字符串 『小林』。这个名称只在该分支的结果表达式中使用。
模式里的 于 描述数据的构造形式,并不是在这里再调用一次构造器。
把两个值放在一起
需要一起返回或传递两个值时,可以使用“对子”。与 构造对子,合 描述对子类型:
「五」与「八」
「整数」合「整数」
第一行是一个值,第二行是它的类型。两个位置也可以使用不同类型,例如姓名和年龄可以组成 「字符串」合「整数」。
下面是取出两个整数并相加的完整程序:
寻观「标准库」之书。
「对子求和」乃化(「整数」合「整数」)而「整数」也。
「对子求和」者会「对子」而
鉴「对子」而
有(「左」与「右」)则「加」于「左」于「右」也。
「打印行」于(「整数表示」于(「对子求和」于(「五」与「八」)))。
输出为 13。模式 「左」与「右」 把第一个值绑定到左,第二个值绑定到右。这里只有一种需要拆解的形式,所以只写一个分支。
只取一个位置
若已有名为 「对子」 的值,可以按位置取值:
「对子」中「零」
「对子」中「一」
位置从零开始。上面的对子中,位置零是 5,位置一是 8。只取一个位置时这种写法很直接;需要同时使用两部分时,模式匹配能为它们提供更有意义的名称。
处理剩下的情况
对于有多个构造器的类型,应考虑每一种情况。也可以在最后用普通名称接住剩余值,例如下面是一个分支片段:
或有「其他」则『未分类』
它会匹配前面没有处理的值。如果每种情况本来就该有不同处理方式,逐一列出构造器更容易检查遗漏。
练习
先写一个只处理整数对子的 「交换」 函数,把 5 与 8 变成 8 与 5。分别打印结果的位置零和位置一,应得到 8、5。下一步可把输入改成字符串与整数的对子,同时修改返回类型,观察两个位置的类型如何交换。
上一章 · 下一章:列表与递归处理 · 目录