F#学习之路(4) 基本类型

     F#基本类型包括整型、浮点型、布尔型(bool)、字符型(char)、字符串型(string),还有元组类型(tuple)、列表类型(list)、数组类型(array),序列类型(seq)。另外,还允许我们定义记录类型(record type)、联合类型(union type)、活动模式等。当然,F#作为一种多范式的编程语言,支持所有的OO编程语法,允许我们定义类、接口、委托、结构等,本篇文章只介绍基本类型,其它类型在后续的文章中一一介绍。

      

 

    上面这张图,比较的详细的介绍了F#的基本类型。左边一列是字量值,中间一列是对应的F#类型,最后一列是对应的.net的类型。尽管上面没有列出整型和浮点型对应的.net类型,但实质上F#中的这些类型都是.net类型的别名。

 

type  uint8 = System. byte  

type  uint16=System.UInt16 

type  uint32=System.UInt32 

type  uint64=System.UInt64 

type   sbyte =System.SByte 

type  int16=System.Int16 

type  int32=System.Int32 

type  int64=System.Int64 

type   float =System.Double 

type   double =System.Double 

type  single=System.Single 

type  float32=System.Single 

 

     一、unit类型

     unit,是Microsoft.FSharp.Core命名空间下Unit类型的别名,它只有一个实例,字量值为(),表示null值。

 

     二、string类型,有几种字面值写法。 

     

# light 

# nowarn  " 62 "  
 

let  str1= " Test 

\tString
"  
 

let  str2= " Test\ 

\tString
"  



let  str3 =  @" Test 

\tString
"  

 

let  str4=  @" Test\ 

\tString
"  

 

[str1;str2;str3;str4] 
| > List.iter ( fun  str  ->  printfn str) 

do  read_line () | >ignore 

 

     打印的结果:

 

         

     (1)str3与str4没有什么好说的,这个与c#的语法相似,表示双引号中字符不发生转义。

     (2)str1与str2的区别是续行符。F#中在一行的结尾使用 \ 来表示连接下一行,而不要加入\r\n换行符。

     (3)需要注意@与=之间要有空格。否则F#会认为这是一个重载的操作符。因为没有定义这个操作符,所以会出错。

 

     三、默认作用在这些类型的操作符是不检查数据溢出的。

 

 

# light 

# nowarn  " 62 "   

let  max_int=Int32.max_int  

do  printfn  " %d "  max_int 

do  printfn  " %d "  (max_int+ 1
 

open  Microsoft.FSharp.Core.Operators.Checked  

do  printfn  " %d "  (max_int+ 1 )  

do  read_line () | >ignore 

 

 

     在c#中有直接的关键字支持,使用checked来检查数据是否溢出。

     在F#中先使用open打开Microsoft.FSharp.Core.Operators.Checked,之后的操作符就会检查数据是否溢出,你运行上面的代码,会发现第二次打印时抛出了溢出异常。

 

     四、类型转换。

     F#是强类型的数据,它使用自动类型推断,不使用隐式类型转换。F#提供了一组函数来支持类型转换,这些函数名称与你要转换的目标类型名一致,另外还提供了一组函数来明显进行类型转换,这些函数使用函数名的规则是:源类型_to_目标类型,目标类型_of_源类型。

 

 

 

# light 

# nowarn  " 62 "  

do  printfn  " %A "  ( sbyte (- 20 )) 

do  printfn  " %A "  ( int ( 20L )) 

do  printfn  " %s "  (int_to_string( 40 )) 

do  printfn  " %s "  (string_of_int( 40 )) 

do  read_line () | >ignore 

 

     五、F#的基本类型大多数是.NET的类型的别名

     因为只不过是别名,那么你可以使用c#原有的知识来操作这些类型。大多数情况下你都符合你的期望。

     需要说明的有两个:

     (1)逻辑操作符

     

# light
# nowarn  " 62 "


let  _ =
    
let  v= 15
    
let  b =v> 9
    printfn 
" %b "  (b && (v< 12   ||  not(v<> 15 )))

do  read_line () | >ignore

     

     在F#中&&逻辑与,||逻辑或与c#是一致的,都是短路的。逻辑非使用not。相等运算符使用=,而不是双等于==,不相等运算符使用<>。      

 

第二、字符串的操作符 

 

# light 

# nowarn  " 62 "  
 

let  str= " Test String "  

do  printfn  " str.[0]=%c\r\nstr[1..5]=%s "  str.[ 0 ] str.[ 5 ..str.Length- 1

do  printfn  " %s "  (str +  "  Concat "
 

do  read_line () | >ignore 

 

F#的索引语法是.[],并且索引支持范围或区间(range),区间使用..

字符串连接同样使用+,不过还有一种兼容Ocaml语法 ^

 

 

总结:F#的大多数类型只是.Net类型的别名,我们原有.net知识基本上可以利用,这无疑加快了学习的步伐。

 

下一篇:F#学习之路(5) 元组类型 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值