算术运算符 (F#)
本主题介绍 F# 语言中提供的算术运算符。
二元算术运算符摘要
下表总结了可用于未装箱的整数类型和浮点类型的二元算术运算符。
二元运算符 |
注释 |
---|---|
+(加号) |
未检查。可能的上溢条件是:将各数字相加之后的和超过相应类型支持的最大绝对值。 |
-(减号) |
未检查。可能的下溢条件是:对无符号类型进行相减,或浮点值太小而无法由相应类型表示。 |
*(乘号) |
未检查。可能的上溢条件是:将各数字相乘之后的积超过相应类型支持的最大绝对值。 |
/(除号) |
对于整数类型,被零除将导致出现 DivideByZeroException。对于浮点类型,被零除将生成特殊的浮点值 +Infinity 或 -Infinity。还有一个可能的下溢条件:浮点数太小而无法由相应类型表示。 |
%(求模符号) |
返回除法运算的余数。结果中的符号与第一个操作数的符号相同。 |
**(幂号) |
可能的上溢条件是:结果超过相应类型的最大绝对值。 求幂运算符仅适用于浮点类型。 |
一元算术运算符摘要
下表总结了可用于整数类型和浮点类型的一元算术运算符。
一元运算符 |
注释 |
---|---|
+(正号) |
可应用于任何算术表达式。不会改变值的符号。 |
-(负号) |
可应用于任何算术表达式。改变值的符号。 |
整数类型在出现上溢或下溢时的行为是发生环绕。这将导致结果不正确。整数上溢是一个可能会很严重的问题,如果编写的软件没有解决这个问题,则可能会带来安全问题。如果您的应用程序需要顾及到这一点,请考虑使用 Microsoft.FSharp.Core.Operators.Checked 中的 checked 运算符。
二进制比较运算符摘要
下表显示了可用于整数类型和浮点类型的二进制比较运算符。这些运算符的返回值是 bool 类型。
绝不应直接对浮点数进行相等比较,因为 IEEE 浮点表示形式不支持完全相等运算。通过检查代码轻松就能验证相等的两个数实际上可能具有不同的位表示形式。
运算符 |
注释 |
---|---|
=(等于) |
这不是赋值运算符。它只用于比较。这是泛型运算符。 |
>(大于) |
这是泛型运算符。 |
<(小于) |
这是泛型运算符。 |
>=(大于或等于) |
这是泛型运算符。 |
<=(小于或等于) |
这是泛型运算符。 |
<>(不等于) |
这是泛型运算符。 |
重载运算符和泛型运算符
本主题讨论的所有运算符均在 Microsoft.FSharp.Core.Operators 命名空间中定义。某些运算符是使用静态解析的类型参数定义的。这意味着,对于使用该运算符的每个特定类型,都存在单独的定义。所有一元和二元的算术运算符和按位运算符都属于此类别。比较运算符是泛型运算符,因此它们适合于任何类型,而不仅仅适合于基元算术类型。已区分联合和记录类型具有各自的自定义实现,这些自定义实现是由 F# 编译器生成的。类类型使用方法 Equals。
可自定义泛型运算符。若要自定义比较函数,可重写 Equals 以提供您自己的自定义相等比较,然后实现 IComparable。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