在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。