模式匹配与递归:SML编程技巧深度解析
立即解锁
发布时间: 2025-08-18 00:31:28 阅读量: 1 订阅数: 3 

### 模式匹配与递归:SML编程技巧深度解析
#### 1. 简化表示法
在编程中,将名称与函数值关联以及调用函数的完整表示法往往冗长繁琐。不过,我们可以对其进行简化。
首先,函数定义 `val name1 = fn name2 => expression` 可简化为 `fun name1 name2 = expression`。例如:
```sml
fun tax sum = sum*25 div 100;
fun plural word = word^"s";
fun voter age = age >= 18;
fun sq (x:int) = x*x;
fun taxdue tax sum = sum*tax div 100;
fun endword ending word = word^ending;
fun doublefunc func (n:int) = 2*func n;
```
需要注意的是,`fun` 是使用 `val` 将名称与显式函数值关联的简写形式。即使表达式返回函数值,也必须使用 `val` 形式将名称与表达式的值关联。例如,`fun ending = endword "ing"` 是错误的,正确形式为 `val ending = endword "ing"`。
函数调用也可通过省略函数表达式周围的严格括号进行简化。例如,`((function argument1) argument2) arguments` 可简化为 `function argument1 argument2 argument3`,并从左到右进行计算。不过,当函数调用或运算符表达式作为另一个函数的参数时,括号必不可少。例如,`sq sq 3` 会被解释为 `(sq sq) 3` 而失败,应使用 `sq (sq 3)`。
#### 2. 表格与函数
表格可用于表示事物的集合,每行事物具有固定数量的属性。但表格只能处理特定值,而函数可通过计算从任意值中得出结果。例如,对于猫的名称和颜色表格:
| 名称 | 颜色 |
| ---- | ---- |
| Wallace | tabby |
| Mog | black |
| Spider | tabby |
我们可通过表格查找猫的颜色,但无法通过名称计算颜色。同样,对于英语动词的过去式,一般规则是在动词后加 “ed”,但有特殊情况,如 “stand” 的过去式是 “stood” 等。我们可用表格表示特殊情况,但难以将一般情况包含在表格中。
#### 3. 模式匹配
SML 中的模式匹配允许函数处理个别情况和一般情况。函数可定义为多个可选情况,每个情况有不同模式:
```sml
fn
pattern1 => expression1 |
pattern2 => expression2 |
…
patternN => expressionN
```
模式可以是常量或绑定变量。调用函数时,参数会依次与每个模式匹配,匹配成功则计算相应表达式。常量模式要求参数值相同才能匹配成功,变量模式可匹配任意值。
模式匹配函数的简化定义形式为:
```sml
fun
name pattern1 = expression1 |
name pattern2 = expression2 |
…
name patternN = expressionN
```
模式匹配是强大的编程技术,可使函数结构反映处理数据的结构,减少条件表达式的使用,提高代码可读性。
#### 4. 字符串模式匹配
以动词过去式表格为例,可在 SML 中用函数表示:
```sml
fun past "stand" = "stood" |
past "swim" = "swam" |
past "eat" = "ate" |
past v = v^"ed";
```
当调用 `past "eat"` 时,“eat” 与 “stand”、“swim” 匹配失败,与 “eat” 匹配成功,返回 “ate”;调用 `past "talk"` 时,与特殊情况匹配失败,绑定变量 `v` 设为 “talk”,返回 “talked”。
对于猫的颜色表格,可定义函数:
```sml
fun colour "Wallace" = "tabby" |
colour "Mog" = "black" |
colour "Spider" = "tabby" |
colour name = name^"unknown";
```
当调用 `colour "Fritz"` 时,与已知名称匹配失败,返回 “Fritz unknown”。
对于英国交通灯序列表格:
| 旧状态 | 新状态 |
| ---- | ---- |
| red | red & amber |
| red & amber | green |
| gre
0
0
复制全文
相关推荐










