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

来源:互联网 发布:西德尼谢尔顿 知乎 编辑:程序博客网 时间:2024/06/05 09:02

     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) 元组类型 

0 0
原创粉丝点击