在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 區(qū)塊鏈/ 高階函數(shù) (Fun)
注冊進程名稱
錯誤處理
完整示例
分布式編程
消息傳遞
if 與 case
健壯性
映射 (Map)
高階函數(shù) (Fun)
輸出至終端
更多關(guān)于列表的內(nèi)容
內(nèi)置函數(shù) (BIF)
模塊與函數(shù)
將大程序分在多個文件中
匹配、Guards 與變量的作用域
超時
列表
完整示例
頭文件
標準模塊與使用手冊
進程
記錄
增加健壯性后的完整示例
Erlang Shell
原子類型

高階函數(shù) (Fun)

Erlang 作為函數(shù)式編程語言自然擁有高階函數(shù)。在 shell 中,我們可以這樣使用:

86> Xf = fun(X) -> X * 2 end.
 #Fun<erl_eval.5.123085357>
87> Xf(5).
10

這里定義了一個數(shù)值翻倍的函數(shù),并將這個函數(shù)賦給了一個變量。所以,Xf(5) 返回值為 10。Erlang 有兩個非常有用的操作列表的函數(shù) foreach 與 map, 定義如下:

foreach(Fun, [First|Rest]) ->
    Fun(First),
    foreach(Fun, Rest);
foreach(Fun, []) ->
    ok.

map(Fun, [First|Rest]) -> 
    [Fun(First)|map(Fun,Rest)];
map(Fun, []) -> 
    [].

這兩個函數(shù)是由標準模塊 lists 提供的。foreach 將一個函數(shù)作用于列表中的每一個元素。 map 通過將一個函數(shù)作用于列表中的每個元素生成一個新的列表。下面,在 shell 中使用 map 的 Add_3 函數(shù)生成一個新的列表:

88> Add_3 = fun(X) -> X + 3 end.
 #Fun<erl_eval.5.123085357>
89> lists:map(Add_3, [1,2,3]).
[4,5,6]

讓我們再次輸出一組城市的溫度值:

90> Print_City = fun({City, {X, Temp}}) -> io:format("~-15w ~w ~w~n",
[City, X, Temp]) end.
 #Fun<erl_eval.5.123085357>
91> lists:foreach(Print_City, [{moscow, {c, -10}}, {cape_town, {f, 70}},
{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
moscow          c -10
cape_town       f 70
stockholm       c -4
paris           f 28
london          f 36
ok

下面,讓我們定義一個函數(shù),這個函數(shù)用于遍歷城市溫度列表并將每個溫度值都轉(zhuǎn)換為攝氏溫度表示。如下所示:

-module(tut13).

-export([convert_list_to_c/1]).

convert_to_c({Name, {f, Temp}}) ->
    {Name, {c, trunc((Temp - 32) * 5 / 9)}};
convert_to_c({Name, {c, Temp}}) ->
    {Name, {c, Temp}}.

convert_list_to_c(List) ->
    lists:map(fun convert_to_c/1, List).
92> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}},
{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
[{moscow,{c,-10}},
 {cape_town,{c,21}},
 {stockholm,{c,-4}},
 {paris,{c,-2}},
 {london,{c,2}}]

convert_to_c 函數(shù)和之前的一樣,但是它現(xiàn)在被用作高階函數(shù):

lists:map(fun convert_to_c/1, List)

當(dāng)一個在別處定義的函數(shù)被用作高階函數(shù)時,我們可以通過 Function/Arity 的方式來引用它(注意,F(xiàn)unction 為函數(shù)名,Arity 為函數(shù)的參數(shù)個數(shù))。所以在調(diào)用 map 函數(shù)時,才會是 lists:map(fun convert_to_c/1, List) 這樣的形式。如上所示,convert_list_to_c 變得更加的簡潔易懂。

lists 標準庫中還包括排序函數(shù) sort(Fun,List),其中 Fun 接受兩個輸入?yún)?shù),如果第一個元素比第二個元素小則函數(shù)返回真,否則返回假。把排序添加到 convert_list_to_c 中:

-module(tut13).

-export([convert_list_to_c/1]).

convert_to_c({Name, {f, Temp}}) ->
    {Name, {c, trunc((Temp - 32) * 5 / 9)}};
convert_to_c({Name, {c, Temp}}) ->
    {Name, {c, Temp}}.

convert_list_to_c(List) ->
    New_list = lists:map(fun convert_to_c/1, List),
    lists:sort(fun({_, {c, Temp1}}, {_, {c, Temp2}}) ->
                       Temp1 < Temp2 end, New_list).
93> c(tut13).
{ok,tut13}
94> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}},
{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
[{moscow,{c,-10}},
 {stockholm,{c,-4}},
 {paris,{c,-2}},
 {london,{c,2}},
 {cape_town,{c,21}}]

在 sort 中用到了下面這個函數(shù):

fun({_, {c, Temp1}}, {_, {c, Temp2}}) -> Temp1 < Temp2 end,

這兒用到了匿名變量 "_" 的概念。匿名變量常用于忽略一個獲得的變量值的場景下。當(dāng)然,它也可以用到其它的場景中,而不僅僅是在高階函數(shù)這兒。Temp1 < Temp2 說明如果 Temp1 比 Temp2 小,則返回 true。

上一篇:模塊與函數(shù)下一篇:消息傳遞