在F#程序设计-入门篇中我们利用了两个程序简单的介绍了下F#,在接下来的F#语言基础中,我们将会介绍F#的基本类型、F#的函数编程、F#语言用到的一些集合类型(比如Map、List)以及最后F#程序的模块(Modules)、命名空间(namespace)。
基本类型
一个类型是一个抽象或者概念,并且主要的是它对于执行是安全的。某些类型或许直接代表一个整数,而另一些表现的更为抽象,比如像函数。F#是静态类型,即类型检查是在编译时完成。例如,如果一个函数接受一个整数作为参数,如果您试图通过一个字符串,你会得到一个编译错误。同C#一样,F#是充分支持.NET 类型的转换以及创建的,比如我们一开始的Hello,World程序中的DateTime就属于.NET类型,除了支持.NET类型外,我们还可以自己定义自己的类型。
在F#中,创建一个值,只需要简单的使用let关键字,让一个值绑定到一个value中,除了创建一个值外,let关键字还可以做很多的事情,比如创建一个函数等,在后面的文章中将会详细的介绍let关键字,现在只要知道,你可以使用一个let关键字来引入一个新的标识就行,比如在FSI中创建一个值x:
> let x = 1;;
val x : int = 1
现在我们要介绍的第一个基本类型是
一、基本数字类型
数字类型包含有整数类型和浮点数类型,下面将列出F#中支持的基本数字类型:
类型 |
后缀 |
对应的.NET类型 |
数值范围 |
byte |
uy |
System.Byte |
0 to 255 |
sbyte |
y |
System.SByte |
−128 to 127 |
int16 |
s |
System.Int16 |
−32,768 to 32,767 |
uint16 |
us |
System.UInt16 |
0 to 65,535 |
int,int32 |
|
System.Int32 |
−231 to 231−1 |
uint,uint32 |
u |
System.UInt32 |
0 to 232−1 |
int64 |
l |
System.Int64 |
−263 to 263−1 |
uint64 |
ul |
System.UInt64 |
0 to 264−1 |
float |
|
|
双精度浮点基于IEEE64标准。代表约15个有效数字值。 |
float32 |
f |
System.Float |
单精度浮点基于IEEE32标准,代表大约有7位有效数字值 |
decimal |
M |
System.Decimal |
固定精度浮点型,28位精度 |
要定义新的数值,使用let关键字以及在整数或浮点数后面带有可选的后缀字符,后缀决定的整数或浮点数字类型,如下面的代码段:
> let answerToEverything = 42UL;;
val everything : uint64 = 42UL
> let pi = 3.1415926M;;
val pi : decimal = 3.1415926M
> let avogadro = 6.022e-23;;
val avogadro : float = 6.022e-23
除此之外,F#将还允许你在数字面前使用前缀0x、0o、0b指定十六进制、八进制、二进制数值,如:
> let hex = 0xFCAF;;
val hex : int = 64687
> let oct = 0o7771L;;
val oct : int64 = 4089L
> let bin = 0b00101010y;;
val bin : sbyte = 42y
> (hex, oct, bin);;
val it : int * int64 * sbyte = (64687, 4089, 42)
如果您对IEEE32和IEEE64标准熟悉,您还可以指定使用十六进制,八进制或二进制浮点数,您还可以指定使用十六进制,八进制或二进制浮点数,F#将把二进制值转换成相应的到浮点数,如下面的代码:
> 0x401E000000000000LF;;
val it : float = 7.5
> 0x00000000lf;;
val it : float32 = 0.0f
数值类型的运算
在数字类型中你可以使用标准的算术运算符,下表列出了F#中支持的运算法则:
操作符 |
描述 |
示例 |
结果 |
+ |
加法运算 |
1+1 |
2 |
- |
减法运算 |
1-1 |
0 |
* |
乘法运算 |
2*3 |
6 |
/ |
除法运算 |
8/3 |
2 |
** |
幂运算 |
2**3 |
8 |
% |
求模 |
7%3 |
1 |
默认情况下,算术运算符不检查溢出,因此,如果您超过了另外一个整数值允许的范围内,正数得出的结果将视为一个负数,相反,如果一个整理类型数字太小,负数将会变成正数,看下面的代码就知道了:
> 32767s + 1s;;
val it : int16 = −32768s
> −32768s + −1s;;
val it : int16 = 32767s
除了四则运算符之外,F#还支持标准数学函数,下面完整的列出了支持的数学函数:
Routine |
Description |
Example |
Result |
abs |
Absolute value of a number |
abs −1.0 |
1.0 |
ceil |
Round up to the nearest integer |
ceil 9.1 |
10 |
exp |
Raise a value to a power of e |
exp 1.0 |
2.718 |
floor |
Round down to the nearest integer |
floor 9.9 |
9.0 |
sign |
Sign of the value |
sign −5 |
−1 |
log |
Natural logarithm |
log 2.71828 |
1.0 |
log10 |
Logarithm in base 10 |
log10 1000.0 |
3.0 |
sqrt |
Square root |
sqrt 4.0 |
2.0 |
cos |
Cosine |
cos 0.0 |
1.0 |
sin |
Sine |
sin 0.0 |
0.0 |
tan |
Tangent |
tan 1.0 |
1.557 |
pown |
Compute the power of an integer |
pown 2L 10 |
1024L |
BigInt类型
如果你正在处理的数据大于264,F#将用BigInt类型来代表任意大的整数,也就是说除非你的内存足够大,否则它就能表示无穷大的数字。 BigInt类型为System.Numerics.BigInteger类型的别名,不仅F#,在C#以及VB.NET中也支持任意大的整数。BigInt类型使用字母I来表述,如语句let x = 1024I。