SML基础类型与操作详解
立即解锁
发布时间: 2025-08-18 00:31:27 订阅数: 3 

# SML 基础类型与操作详解
## 1. 操作符与表达式计算规则
### 1.1 重复操作符的计算顺序
在表达式中,相同的操作符可以在不使用括号的情况下重复出现。对于具有相同优先级的操作符,涉及重复操作符的表达式从左到右进行计算。例如:
```sml
- 1+2+3;
> 6 : int
```
对于 `-`、`div` 和 `mod` 操作符,计算顺序尤为重要。从左到右计算时:
```sml
- 6−4−2;
> 0 : int
```
而从右到左计算时(使用括号改变顺序):
```sml
- 6−(4−2);
> 4 : int
```
### 1.2 元组类型操作符
`div` 和 `mod` 是应用于两个整数元组的特殊 SML 操作符。可以使用 `op` 函数将这些特殊操作符转换为作用于元组的函数。例如:
```sml
- (op div) (126, 3);
> 42 : int
```
这与下面的表达式等价:
```sml
- 126 div 3;
> 42 : int
```
同样地,对于 `mod` 操作符:
```sml
- (op mod) (97, 55);
> 42 : int
```
等价于:
```sml
- 97 mod 55;
> 42 : int
```
通过 `op` 可以将这些操作符转换为函数并显示其类型:
```sml
- op div;
> fn : int*int -> int
- op mod;
> fn : int*int -> int
```
这表明 `op div` 和 `op mod` 是从 `int * int` 域到 `int` 范围的函数。
### 1.3 实数操作符
SML 提供了多种中缀实数操作符:
- 加法操作符 `+`:
```sml
- 3.3+38.7;
> 42.0 : real
```
- 减法操作符 `-`:
```sml
- 81.7−39.7;
> 42.0 : real
```
- 乘法操作符 `*`:
```sml
- 8.0*5.25;
> 42.0 : real
```
- 除法操作符 `/`:
```sml
- 189.0/4.5;
> 42.0 : real
```
对于实数,前缀取反操作符是 `~`。这些操作符可以与括号一起使用来构建复杂的表达式。操作符和括号的优先级从高到低依次为:
1. `(…)`
2. 函数调用
3. `~`
4. `*/`
5. `+−`
例如:
```sml
- 3.2*11.0+6.8;
> 42.0 : real
```
计算过程为:
```sml
3.2*11.0 ==> 35.2
3.2*11.0+6.8 ==> 35.2+6.8 ==> 42.0
```
而使用括号改变计算顺序时:
```sml
- 3.2*(11.0+6.8);
> 56.96 : real
```
计算过程为:
```sml
11.0+6.8 ==> 17.8
3.2*(11.0+6.8) ==> 3.2*17.8 ==> 56.96
```
使用 `op` 可以显示 `/` 操作符的类型:
```sml
- op/;
> fn : real*real -> real
```
这表明 `op /` 是从两个实数元组到一个实数的函数:
```sml
- (op /) (126.0, 3.0);
> 42.0 : real
```
### 1.4 重载操作符
适用于不同类型的操作符称为重载操作符。`+`、`-` 和 `*` 是重载操作符,因为它们可以应用于两个整数或两个实数。同样,`~` 也是重载操作符,因为它可以应用于整数或实数。SML 无法显示重载操作符的类型,因为它无法确定需要使用哪个版本。一些语言会提供不同的操作符来区分整数和实数运算,而 SML 对这两种情况使用相同的操作符。
### 1.5 混合类型算术
在 SML 中,不允许使用混合类型的表达式。重载操作符 `+`、`-` 和 `*` 必须始终应用于两个整数或两个实数,`div` 和 `mod` 只能用于整数,`/` 只能用于实数。为了实现混合类型的算术运算,SML 提供了转换函数。
- `real` 函数将整数转换为实数:
```sml
- real 42;
> 42.0 : real
```
`real` 函数的类型为:
```sml
- real;
> fn : int -> real
```
- `floor` 函数返回不大于实数参数的最大整数:
```sml
- floor (84.6/2.0);
> 42 : int
```
`floor` 函数的类型为:
```sml
- floor;
> fn : real -> int
```
使用 `real` 和 `floor` 可以进行混合模式的算术运算,以确保类型一致性。例如,将整数与实数相乘得到整数:
```sml
- 3*(floor 14.1);
> 42 : int
```
将实数与整数相乘得到实数:
```sml
- 3.0*(real 14);
> 42.0 : real
```
### 1.6 字符串操作符
字符串的操作符比其他基本类型少。
- `size` 函数返回字符串中的字符数作为整数:
```sml
- size "banana";
> 6 : int
```
`size` 函数的类型为:
```sml
- size;
> fn : string -> int
```
- 中缀操作符 `^` 用于将两个字符串首尾相连:
```sml
- "fish"^"finger";
> "fishfinger" : string
```
`op ^` 的类型为:
```sml
- op ^;
> fn : string * string -> string
```
`^` 操作符可以在表达式中重复使用:
```sml
- "fish"^" "^"finger"
> "fish finger" : string
```
### 1.7 比较操作符
SML 提供了用于比较相同类型值的重载中缀操作符。
- `=` 操作符检查两个值是否相同:
```sml
- 2=2;
> true : bool
```
```sml
- "chalk"="cheese";
> false : bool
```
- `< >` 操作符检查两个值是否不同。这些操作符返回布尔值,并且适用于大多数类型的值,但不适用于函数。对于元组,会比较相应的元素。如果相应元素相同,则元组相同。例如:
```sml
- (42, 42.0)=(42, 42.0);
> true : bool
```
```sml
- ("forty", "two")=("forty", "three");
> false : bool
```
比较操作符的优先级低于布尔、算术、实数和字符串表达式,因此在这些操作数之后进行计算。例如:
```sml
- 2=1+1;
> true : bool
```
计算过程为:
```sml
2=1+1 ==> 2=2 ==> true
```
还有用于测试相同类型值顺序的重载中缀比较操作符:`<`、`<=`、`>=` 和 `>`。这些操作符返回布尔值,适用于整数和实数。许多 SML 系统也允许对字符串进行字母顺序比较。例如:
```sml
- 42 <= 41;
> false
```
```sml
- "haggis "< "oatcake";
> true : bool
```
这些比较操作符返回布尔值,因此可以用作 `andalso` 和 `orelse` 的表达式操作数。例如:
```sml
- "a"<"b" andalso "b"<"c";
> true : bool
```
计算过程为:
```sml
"a"<"b" andalso "b
```
0
0
复制全文
相关推荐









