F#入門-第三章 功能性-第二節 高階函數(map)

    高階函數是指將函數作爲參數或返回值的函數。熟練使用高階函數,可以使代碼變得非常簡潔。另外,爲了將函數提交給高階函數,需要額外書寫一些函數,但是因爲F#具有柯里化和匿名函數的特性,所以書寫起來也十分方便,所以儘量熟悉掌握高階函數比較好。

    另外,如果考慮柯里化的話,從某種意義上來說,所有帶兩個以上的參數的函數都是高階函數,雖然如此,但是這裏舉例的時候還是隻舉將其他函數作爲參數的函數的例子。

    首先,讓我們來看map函數。map函數帶有兩個參數,一個參數爲帶一個參數的函數(假定函數名爲f),另一個參數爲數據集合,將數據集合中的數據一個一個作爲f函數的參數傳入,分別執行函數f,並將這些執行結果作爲集合返回。這時,原來的數據集合不變,同時創建了一個新的執行結果的集合。

    讓我們具體看個例子。

針對列表的map函數
//爲了提交給高階函數而進行的函數定義
> let add1 x = x 1;;
val add1 : int -> int
//List.map是針對列表的map函數
//列表[1..10]中的所有元素全部加1並將計算結果返回的函數
> List.map add1 [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]

//有技巧的函數:利用匿名函數
> List.map (fun x -> x 1) [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]

//有技巧的函數:利用柯里化
> List.map (( )1) [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]

//因爲List.map的執行結果是列表,所以可以重複利用(針對[1..10]執行2*(x 1)計算)
> List.map (( * )2) (List.map (( )1) [1..10]);;
val it : int list = [4; 6; 8; 10; 12; 14; 16; 18; 20; 22]

//f函數的返回值可以是別的類型。創建多維列表
> List.map (fun x -> (x,10-x)) [1..3];;
val it : (int * int) list = [(1, 9); (2, 8); (3, 7)]

//前面的綜合應用:將map組合後按順序生成多維列表
> let junretu lst = List.map (fun x -> List.map (fun y -> (x,y)) lst) lst;;
val junretu : 'a list -> ('a * 'a) list list
> junretu [1..3];;
val it : (int * int) list list
= [[(1, 1); (1, 2); (1, 3)]; [(2, 1); (2, 2); (2, 3)]; [(3, 1); (3, 2); (3, 3)]]


    不僅是列表,也有針對數組的map函數和針對序列的map函數。

針對其他類型的map函數
//針對數組的map
> Array.map (( )1) [|1..10|];;
val it : int [] = [|2; 3; 4; 5; 6; 7; 8; 9; 10; 11|]
//針對序列的map函數
> Seq.map (( )1) [1..10];;
val it : seq<int> = seq [2; 3; 4; 5; ...]
> Seq.map (( )1) [|1..10|];;
val it : seq<int> = seq [2; 3; 4; 5; ...]


    當然,其他還有針對Set,Hash和樹等等的馬map,只要是數據集合,都可以考慮使用map函數。

    最後,用將針對列表的map函數進行封裝的實例來結束本節。

針對列表的map函數的封裝
> let rec mymap f lst =
- match lst with
- | [] -> []
- | h::t -> (f h)::mymap f t;;
val mymap : ('a -> 'b) -> 'a list -> 'b list

> mymap (( )1) [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]

 

發佈了55 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章