|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。利用F#举行算术操纵 基础范例:
范例 形貌 示例 .NET范例 bool True/falsevalues true,false System.Boolean byte 8-bitunsignedintegers 0uy,19uy,0xFFuy System.Byte sbyte 8-bitsignedintegers 0y, 19y,0xFFy System.SByte int16 16-bitsignedintegers 0s, 19s,0x0800s System.Int16 uint16 16-bitunsignedintegers 0us,19us,0x0800us System.UInt16 int, int32 32-bitsignedintegers 0, 19,0x0800,0b0001 System.Int32 uint32 32-bitunsignedintegers 0u, 19u,0x0800u System.UInt32 int64 64-bitsignedintegers 0L, 19L,0x0800L System.Int64 uint64 64-bitunsignedintegers 0UL,19UL,0x0800UL System.UInt64 nativeint Machine-sizedsignedintegers 0n, 19n,0x0800n System.IntPtr unativeint Machine-sizedunsignedintegers 0un,19un,0x0800un System.UIntPtr single,float32 32-bitIEEEfloating-point 0.0f,19.7f,1.3e4f System.Single double,float 64-bitIEEEfloating-point 0.0,19.7,1.3e4 System.Double decimal High-precisiondecimalvalues 0M, 19M,19.03M System.Decimal bigint Arbitrarilylargeintegers 0I, 19I Math.BigInt bignum Arbitrary-precisionrationals 0N, 19N Math.BigNum unit Thetypewithonlyonevalue () Core.Unit
在F#中,对数字的加减乘除操纵均是不反省的(unchecked);就是说假如超越局限,不会失掉非常。比方,2147483647是最年夜的32位整数:
> 2147483647+1;;
val it : int = -2147483648
同时,我们也供应了反省溢出的完成:Microsoft.FSharp.Core.Operators.Checked。这个模块(module)中完成的操纵将在移除产生时抛出System.OverflowException非常。
假如但愿制止溢出,可使用decimal,bigint和bignum范例。
除零将会失掉System.DivideByZeroException,但浮点数(floating-pointnumber)除外,浮点数除零将会前往Infinity和-Infinity。
经由过程范例推导(typeinference)来断定操纵符重载―假如没有重载则F#商定利用32位整数的操纵符。
假如但愿利用指定范例的操纵符,则必需利用范例正文(typeannotation)来匡助范例推导器推导出准确的了局:
> let squareAndAdd a b = a * a + b;;
val squareAndAdd : int -> int -> int
假如我们必要指定利用float的操纵符,只需:
> let squareAndAdd (a:float) b = a * a + b;;
val squareAndAdd : float -> float -> float
这就是范例推导器发扬的感化。
位(bitwise)操纵
位操纵符:
操纵符 形貌 举例 了局 &&& 与 0x65&&&0x0F 0x05 或 0x650x18 0x7D ??? 异或 0x65???0x0F 0x6A ~~~ 求反 ~~~0x65 0xFFFFFF9a <<< 左移 0x01<<<3 0x08 >>> 右移 0x65>>>3 0x0C
将一个32位整数编码成(encode)1,2,或5个字节,并用一个数字列表前往。
let encode (n: int32) =
if (n >= 0 && n <= 0x7F) then [ n ]
elif (n >= 0x80 && n <= 0x3FFF) then [ (0x80 (n >>> 8)) &&& 0xFF;
(n &&& 0xFF) ]
else [ 0xC0; ((n >>> 24) &&& 0xFF);
((n >>> 16) &&& 0xFF);
((n >>> 8) &&& 0xFF);
(n &&& 0xFF) ]
挪用:
> encode 32;;
val it : int32 list = [32]
> encode 320;;
val it : int32 list = [129; 64]
> encode 32000;;
val it : int32 list = [192; 0; 0; 125; 0]
数字范例转换
分歧数字范例之间不会隐式转换。必需利用响应的操纵符举行显式的范例转换:
操纵符 形貌 用法 了局 sbyte 转换为sbyte sbyte(-17) -17y byte 转换为byte byte255 255uy int16 转换为int16 int160 0s uint16 转换为uint16 uint1665535 65535us int/int32 转换为int int17.8 17 uint32 转换为uint32 uint3212 12u int64 转换为int64 int64(-100.4) -100L uint64 转换为uint64 uint641 1UL float32 转换为float32 float3265 65.0f float 转换为float float65 65.0
必要注重的是,这些转换都是不反省溢出的。不会抛出非常。如必要利用溢出非常,仍是必要利用Microsoft.FSharp.Core.Operators.Checked模块下的操纵符。大概也能够利用.NET的System.Convert。但利用System.Convert会带来一些成绩,必要利用范例正文来匡助范例推导器事情。
数字对照
可使用的操纵符为=,,<,<=,>,>=,min和max。全都和字面的意义不异。
必要注重的是,当对浮点数举行操纵的时分,这些操纵符完成了IEEE的NaN。任何包括NaN的对照操纵城市前往false。
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么? |
|