F# 入门(四):let语句——值的绑定/函数定义
let是F#里的最基础和最主要的一个关键字,let语句是变量赋值以及对变量进行函数定义的语句。
let语句主要用来进行变量值得绑定,绑定的值是不能改变的,也就是跟常量一样,这样做可以避免很多程序员疏忽等人为BUG。当然可以通过添加mutable关键字来进行非常量绑定。如下:
let helloStr = "Hello World" // 不可变的值
let mutable num = 10 // 定义一个可变的值
num <- 15 //给num值赋值
关于变量和函数的作用域会在接下来介绍F#代码结构中讲到。另外由于F#是垂直编译的(即编译顺序从上到下),所以F#的代码文件是有上下顺序的,规则是同文件中上面代码不能调用定义在下面的值和函数,对于不同文件,被引用的代码要定义在上面的文件里,因为会先编译(在下篇会详细讲到)。
用let 进行函数定义,一般有两种方式:
- let 函数名 形式参数1 形式参数2 … = 函数体
这种方式定义的函数类型是根据函数体内具体情况来推断出参数的具体类型的,如
let addone a = a + 1
定义了名为"addone"的函数,根据函数体编译器自动推断出参数a是int型变量,当然负责的函数体也一样,但如果函数体里也没有明确的可以推断的话,该值就默认是个泛型'a.
2)let 函数名 (形式参数1:数据类型) (形式参数2:数据类型) ... = 函数体
let f (x:float) = x * 2.0
这种就跟C# 一样显示的定义参数的类型。
函数的返回值类型:返回值类型就是该函数体最后一行(语句)的值类型。
如:
let square x = x * x // 如果没有明确推断,乘法计算默认是整形,即返回整形
let hello name =
let a= 1
printfn "hello %s" name //这里name根据%s推断出是字符串类型,而printfn函数无返回值,所以该函数返回值是 void
let test a =
a * 3.0 //推断出是float,所以返回值是float型,注,F#中float即是double型
//() //如果想不返回值,在函数体最后加()即void
let returntMultipleValues a b =
...
(a*2,b + 5, a*b) //返回多个值
递归函数
用let rec语句来定义递归函数:
let rec fibonacci n = //斐波那契的递归
if n = 0 then 0
else if n = 1 then 1
else fibonacci (n-1) + fibonacci (n-2)
fibonacci 10 |> printfn "result: %d"
上面定义一个计算斐波那契数列的函数然后输出第10个斐波那契数。递归函数在实际的计算和应用中很有用,所以应当熟练使用。