仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1178|回复: 9
打印 上一主题 下一主题

[学习教程] ASP.NET教程之【F#2.0系列】利用F#举行算术操纵

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:20:35 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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。
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-9 13:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表