F#学习之路(4) 基本类型
F#基本类型包括整型、浮点型、布尔型(bool)、字符型(char)、字符串型(string),还有元组类型(tuple)、列表类型(list)、数组类型(array),序列类型(seq)。另外,还允许我们定义记录类型(record type)、联合类型(union type)、活动模式等。当然,F#作为一种多范式的编程语言,支持所有的OO编程语法,允许我们定义类、接口、委托、结构等,本篇文章只介绍基本类型,其它类型在后续的文章中一一介绍。
上面这张图,比较的详细的介绍了F#的基本类型。左边一列是字量值,中间一列是对应的F#类型,最后一列是对应的.net的类型。尽管上面没有列出整型和浮点型对应的.net类型,但实质上F#中的这些类型都是.net类型的别名。
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类型,有几种字面值写法。
#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#会认为这是一个重载的操作符。因为没有定义这个操作符,所以会出错。
三、默认作用在这些类型的操作符是不检查数据溢出的。
#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_源类型。
#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)逻辑操作符
#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。相等运算符使用=,而不是双等于==,不相等运算符使用<>。
第二、字符串的操作符
#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知识基本上可以利用,这无疑加快了学习的步伐。