Erlang函數學習

Erlang的普通函數和匿名函數fun:

範例1:以下函數列出商品的價格。該函數包含5個子句,各個子句之間由分號;分隔。
            要在函數所在模塊之外使用該函數,應該在-export中導出改函數。
-module(shop).
-export([cost/1]).

cost(oranges)   -> 5;
cost(newspaper) -> 8;
cost(apples)    -> 2;
cost(pears)     -> 9;
cost(milk)      -> 7.

範例2:以下函數計算購物清單的商品總價格。
-module(shop1).
-export([total/1]).

total([{What,N}|T]) ->
        shop:cost(What)*N + total(T);
total([]) ->
        0.
執行:
1>Buy=[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}].
2>total(Buy).

範例3:同名不同目的函數,以下是兩個不同的函數。
sum(L)  -> sum(L,0).
sum([],N)       -> N;
sum([H|T],N)    ->sum(T,H+N).

fun 匿名函數
fun既可以做函數的參數,也可以做函數(或fun)的結果。
這樣的函數分別叫:以fun爲參數的函數,返回fun的函數。

以fun爲參數的函數:
例:
1>Double= fun(X) -> 2 * X end.
2>L = [1,2,3,4].
3>lists:map(Double,L).        返回結果:[2,4,6,8]
4>Even = fun(X) -> (X rem 2) =:= 0  end.            (=:= 是恆等符號)
5>lists:filter(Even,L).            返回結果:[2,4]
6>lists:map(Even,L).            返回結果:[false,true,false,true]

lists:map(F,L)    將fun F應用到列表L的每個元素上,並返回一個新的列表。
lists:filter(P,L).  返回一個新列表,新列表的每個元素由L中每一個能滿足P(E)爲true的元素組成。
像map,filter這樣的函數,在一個函數調用中處理整個列表的操作,使程序變得簡潔易懂。

返回fun的函數:
例:
1>Fruit = [apple,pear,orange].
2>MakeTest = fun(L) -> (fun(X) -> lists:member(X,L) end)  end.    
3>IsFruit = MakeTest(Fruit).            【MakeTest返回的是一個函數】
4>IsFruit(apple).
true
5>IsFruit(dog).
false
6>lists:filter(IsFruit,[orange,apple,dog,cat,bear]).

簡單列表處理:

-module(mylists).
-export([sum/1,
        map/2]).
%%這兩個是標準庫lists模塊中map函數的定義
sum([])         -> 0;
sum([H|T])      -> H + sum(T).
map(_,[])       -> [];
map(F,[H|T])    -> [F(H)|map(F,T)].

有了sum和map這兩個函數,就可以對上面的total函數做下改進了:
-module(shop2).
-export([total/1]).
-import(lists,[map/2,sum/1]).

total(L) ->
        sum(map(fun({What,N})->shop:cost(What)*N end,L)).



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章