算术运算符
本主题介绍 F# 中使用的算术运算符。
二进制算术运算符摘要
下表总结了可用于未装箱整数和浮点类型的二进制算术运算符。
二进制运算符 | 说明 |
---|---|
+ (加法,加) |
取消选中。 当数字相加并且总和超过该类型支持的最大绝对值时可能出现溢出情况。 |
- (减法,减) |
取消选中。 当提取无符号类型或浮点值太小而不能由类型表示时,可能出现下溢情况。 |
* (乘法,乘以) |
取消选中。 当数字相乘并且乘积超过该类型支持的最大绝对值时可能出现溢出情况。 |
/ (除法,除以) |
对于整型类型,以零作除数会导致 DivideByZeroException。 对于浮点类型,以零作除数会得到特殊的浮点值 infinity 或 -infinity 。 当浮点数太小而无法由类型表示时,也可能出现下溢情况。 |
% (余数,求余) |
返回除法运算的余数。 结果的符号与第一个操作数的符号相同。 |
** (乘方,求幂) |
当结果超过该类型的最大绝对值时可能出现溢出情况。 幂运算符仅适用于浮点类型。 |
一元算术运算符摘要
下表总结了可用于未装箱整数和浮点类型的一元算术运算符。
一元运算符 | 说明 |
---|---|
+ (正) |
可应用于任何算术表达式。 不会更改值的符号。 |
- (求反,负) |
可应用于任何算术表达式。 更改值的符号。 |
整数类型的溢出或下溢行为是回绕。 这会导致不正确的结果。 整数溢出是一个潜在的严重问题,如果没有编写软件来解决它,则可能会导致安全问题。 如果这是你的应用程序需要关注的问题,请考虑使用 Microsoft.FSharp.Core.Operators.Checked
中的选中运算符。
二进制比较运算符摘要
下表显示了可用于整型和浮点型的二进制比较运算符。 这些运算符返回 bool
类型的值。
切勿直接比较浮点数是否相等,因为 IEEE 浮点表示不支持精确的相等运算。 可以通过检查代码轻松验证是否相等的两个数字实际上可能具有不同的位表示。
运算符 | 说明 |
---|---|
= (相等,等于) |
这不是赋值运算符。 该运算符仅用于比较。 这是一个泛型运算符。 |
> (大于) |
这是一个泛型运算符。 |
< (小于) |
这是一个泛型运算符。 |
>= (大于或等于) |
这是一个泛型运算符。 |
<= (小于或等于) |
这是一个泛型运算符。 |
<> (不等于) |
这是一个泛型运算符。 |
重载和泛型运算符
本主题中讨论的所有运算符均在 Microsoft.FSharp.Core.Operators 命名空间中定义。 一些运算符使用静态解析的类型参数进行定义。 这意味着与该运算符一起使用的每种特定类型都有单独的定义。 所有一元和二进制算术和位运算符都属于这一类。 比较运算符是泛型运算符,因此适用于任何类型,而不仅仅适用于基元算术类型。 可区分的联合和记录类型具有它们自己的自定义实现,这些实现由 F# 编译器生成。 类类型使用方法 Equals。
泛型运算符可自定义。 要自定义比较函数,请重写 Equals 以提供你自己的自定义相等比较,然后实现 IComparable。 System.IComparable 接口具有单个方法,即 CompareTo 方法。
运算符和类型推理
在表达式中使用运算符会限制对该运算符的类型推理。 此外,运算符的使用会阻止自动泛化,因为使用运算符意味着算术类型。 在没有任何其他信息的情况下,F# 编译器将 int
推断为算术表达式的类型。 可以通过指定其他类型来重写此行为。 因此,以下代码中 function1
的参数类型和返回类型被推断为 int
,但 function2
的类型被推断为 float
。
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y