1. let 綁定
F#使用let關鍵字來將一個變量或者函數綁定到一個標識符上。例如:
let i=5*5
結果為:
val i : int = 25
也可以綁定函數到標示符:
let f i=i*i let j=f 5
結果為:
val f : int -> int
val j : int = 25
這表示f是一個接受一個int型參數並且返回int的函數。
2. 函數
函數是F#中的一等公民,和變量具有同等的地位。函數可以用lambda表達式來定義:
let f= fun x y->x+y let g= fun x y->x*y
lambda表達式是由fun關鍵字開始,加上一組用空格隔開的參數列表,->和表達式組成。 上面兩句語句的結果是定義的變量如下:
val f : int -> int -> int
val g : int -> int -> int
在F#中,多個參數的函數的概念比較特殊,它表示,這個語句定義了一個函數,它接受一個整型參數(x),返回一個函數(int->int),這個函數接受一個整型參數(y),返回一個整數。
調用函數的方法是函數名加上空格再加上空格分開的參數列表,
let result = f 3 5
結果為:
val result : int = 8
本質上,根據上面的解釋,可以認為F#的函數都是單變量的,只是f 3返回的是一個函數,這個函數作用在5上,得到了8.例如,我們可以這樣證實這種說法:
let inc=f 1 let result=inc 5
結果為:
val inc : (int -> int)
val result : int = 6
很明顯,inc等價於
let inc=fun y->1+y
F#不需要顯式的指定參數的類型,但它是強類型的編程語言,它會根據定義自動推測出適當的類型,例如,f的兩個參數和返回值都被定義為int。如果執行:
let result=f 3.3 4將會報錯:
error FS0001: This expression was expected to have type
int
but here has type
float
F#也允許顯式的指定參數的類型:
let f= fun (x:float) (y:float)->x+y let result=f 3.3 4.0
結果為:
val f : float -> float -> float
val result : float = 7.3
函數還可以用一種簡潔的語法來定義:
let g x y=x*y
函數和普通變量是一樣的,因此可以作為函數的參數,例如:
let compose f g = fun n -> f (g n)
compose函數接受兩個參數,返回這個兩個函數的復合。
let f= fun x -> x+1 let g x = x*2 let result=compose f g 3
結果為 7.
注意看下compose的類型:
val compose : ('a -> 'b) -> ('c -> 'a) -> 'c –> 'b
這說明F#自動識別出compose所能能接受的類型是,第一個參數是一個函數,接受類型為a的參數,返回類型為b,第二個參數是一個函數,接受參數類型為c,返回類型為a,注意到第二個函數的返回類型必須和第一個函數的類型一致他們才能復合。返回的是一個函數,接受類型為c的參數,返回類型為b。
遞歸函數要用rec關鍵字顯式聲明:
let rec sum m n= if m=n then n else m+ sum (m+1) n let res=sum 1 100
結果自然為5050
函數復合和管道
let function1 x = x + 1 let function2 x = x * 2 let h = function1 >> function2 let result = h 100
>>可以將兩個函數復合,結果是202
let result = 100 |> function1 |> function2|>可以將結果傳遞給下一個函數