F#5:运算符

我打算写1/2篇关于F#语句的不错的博客文章,但是后来我想,老实说,我只是简单地重复列出了所有F#语句的MSDN上已经免费提供的内容,却看不到太多优势。

您可以在此MSDN页面上找到所有F#运算符和字符的完整列表。

如果您单击此链接,那么您首先了解的是F#有很多运算符和符号,对于我来说太多了,不能包含在一篇博客文章中。 考虑到这一点,我打算创建一个关于运营商的不错的博客文章,并决定将范围缩小一点,只包括对最常见的运营商的讨论,所以我想您可以说这将只是1/4或不错的职位的1/8,对此我深表歉意。

现在,在我们开始之前,我只想说我将只经历最常见的运算符; 当您真正开始使用F#时,您很可能必须研究我在本文开头所包含的MSDN链接,但是现在我希望我们所研究的MSDN链接足以使我们开始使用。

算术运算符


+求和
无法控制的。 可能的溢出条件是对数字求和,并且总和超过该类型支持的最大绝对值。

-减法
无法控制的。 当减去无符号类型或浮点值太小而无法用该类型表示时,可能发生欠填充情况。

*乘法
无法控制的。 如果数字相乘且乘积超过类型支持的最大绝对值,则可能发生溢出。

/部门
除以零会引发整数类型的DivideByZeroException。 对于浮点类型,除以零会为您提供特殊的浮点值+ Infinity或-Infinity。 当浮点数太小而无法用类型表示时,底部填充条件也是可能的。

%模组
返回除法运算的其余部分。 结果的符号与第一个操作数的符号相同。

**曝光
当结果超过该类型的最大绝对值时,可能发生溢出情况。 幂运算符仅适用于浮点类型。

演示版


//Arithmetic operators printfn "25 + 25 = %i" (25 + 25) printfn "75 - 25 = %i" (75 - 25) printfn "12 * 12 = %i" (12 * 12) printfn "100 / 4 = %i" (100 / 4) printfn "101 %% 10 = %i" (101 % 10) printfn "2 ** 3 = %f" (2.0 ** 3.0) 

这是启动结果:

图片

二元运算符


下表显示了可用于整数类型和浮点类型的二进制比较运算符。 这些运算符返回布尔类型的值。

=相等
这不是赋值运算符。 它仅用于比较。 这是一个通用运算符。

>超过
这是一个通用运算符。

<小于
这是一个通用运算符。

> =大于或等于
这是一个通用运算符。

<=大于或等于
这是一个通用运算符。

<>不相等
这是一个通用运算符。

 //Binary operators printfn "25 = 25 = %b" (25 = 25) printfn "26 > 25 = %b" (26 > 25) printfn "26 < 25 = %b" (26 < 25) printfn "26 >= 25 = %b" (26 >= 25) printfn "26 <= 25 = %b" (26 <= 25) printfn "'a' <= 'b' = %b" ('a' <> 'b') //how about a more complex example, a tuple printfn "(1,'a') = (2,'a') = %b" ((1,'a') = (2,'a')) printfn "(1,'a') = (1,'a') = %b" ((1,'a') = (1,'a')) printfn "Some(1) = Some(2) = %b" (Some(1) = Some(2)) printfn "Some(2) = Some(2) = %b" (Some(2) = Some(2)) 

图片

布尔运算符


下表列出了F#中可用的逻辑运算符。 这些运算符唯一支持的类型是bool类型。


布尔取反

||
逻辑或

&&
逻辑与

这是上面列出的布尔运算符的一个小例子

 //Boolean operators printfn "not true = %b" (not true) printfn "true || false = %b" (true || false) printfn "true && true = %b" (true && true) printfn "true && false = %b" (true && false) 

图片

位运算符


下表描述了F#中未打包整数类型支持的按位运算符。

&&&
按位AND运算符。 当且仅当两个源操作数中的对应位均为1时,结果位的值为1。

|||
按位或运算符。 如果源操作数中的任何对应位为1,则结果位的值为1。

^^^
按位异或运算符“ OR”。 当且仅当原始操作数中的位具有不相等的值时,结果位的值才为1。

~~~
按位求反运算符。 这是一元运算符,其结果是将原始操作数中的所有0位都转换为1位,并且将所有1位都转换为0位。

<<<
按位左移运算符。 结果是第一个操作数,其位数向左移动了第二个操作数中的位数。 从最高有效位开始移位的位不会变为最低有效位。 最低有效位用零填充。 第二个参数的类型是int32。

>>>
按位右移运算符。 结果是第一个操作数,其位数向右移动了第二个操作数中的位数。 从最低有效位开始移位的位不会变为最高有效位。 对于无符号类型,最高有效位用零填充。 对于有符号类型,最高有效位用1填充。 第二个参数的类型是int32。

 //Bit shift operators //&&& and printfn "2 &&& 4 (which is 0010 &&& 0100, should be 0) = %X" (2 &&& 4) printfn "2 &&& 3 (which is 0010 &&& 0011, should be 2) = %X" (2 &&& 3) //||| or printfn "2 ||| 4 (which is 0010 ||| 0100, should be 6) = %X" (2 ||| 4) printfn "2 ||| 3 (which is 0010 ||| 0011, should be 3) = %X" (2 ||| 3) //^^^ xor printfn "2 ^^^ 4 (which is 0010 ^^^ 0100, should be 6) = %X" (2 ^^^ 4) printfn "2 ^^^ 3 (which is 0010 ^^^ 0011, should be 1) = %X" (2 ^^^ 3) //^^^ negate printfn "~~~4 (which is not 0100, should be 1011 (B hex), or 11 decimal) = %X" (~~~4) //<<< bit shift left printfn "4 <<< 1 (which is 0100 <<< by 1 place left , should be 1000 (8 hex), or 8 decimal) = %X" (4 <<< 1) //>>> bit shift right printfn "4 >>> 1 (which is 0100 >>> by 1 place right , should be 0010 (2 hex), or 2 decimal) = %X" (4 >>> 1) 

图片

操作员超载


如前所述,有时您需要实现自己的运算符逻辑。 在其他.NET语言中,这可以通过提供自己的运算符重载来实现。 毫不奇怪,您需要在F#中执行相同的操作。 我还不想进入类和面向对象,但这似乎与当前的讨论一致,所以让我们看看如何在F#中实现自己的运算符。

我再次从MSDN偷了它。 以下代码说明了一个只有两个运算符的向量类:一个用于一元减号,另一个用于与标量相乘。 在此示例中,标量乘法需要两个重载,因为运算符必须工作,而不管矢量和标量出现的顺序如何。

 type Vector(x: float, y : float) = member this.x = x member this.y = y static member (~-) (v : Vector) = Vector(-1.0 * vx, -1.0 * vy) static member (*) (v : Vector, a) = Vector(a * vx, a * vy) static member (*) (a, v: Vector) = Vector(a * vx, a * vy) override this.ToString() = this.x.ToString() + " " + this.y.ToString() 

Source: https://habr.com/ru/post/zh-CN470219/


All Articles