一般程序性程式語言會有if else,假設要寫一個依據性別判斷
打招呼時要加Mr. 或是 Mrs.
可能會用以下的方式:
function greet(Gender, Name)
if Gender == male then
print("Hello, Mr. %s!", Name)
else if Gender == female then
print("Hello, Mrs. %s!", Name)
else
print("Hello, %s!", Name)
end
在erlang中,我們是用模式比對的方式.
-module(greetsample).
-export([greet/2]).
greet(male, Name) ->
io:format("Hello, Mr. ~s!", [Name]);
greet(female, Name) ->
io:format("Hello, Mrs. ~s!", [Name]);
greet(_, Name) ->
io:format("Hello, ~s!", [Name]).
編譯及執行:
1> c("greetsample").
{ok,greetsample}
2> greetsample:greet(male, tom).
Hello, Mr. tom!
ok
3> greetsample:greet(female, miku).
Hello, Mrs. miku!
ok
4> greetsample:greet(robot, r2d3).
Hello, r2d3!
ok
其中 _, 代表任意的.會依照順序比對,所以任意的,要放在後面.
這樣效果與if else的方式相同.
若我們要寫一個函數來判斷輸入的兩個參數是否相同,
你會怎樣寫呢?
請看以下的範例:
-module(samesample).
-export([same/2]).
same(X,X) ->
true;
same(_,_) ->
false.
編譯及執行:
1> c("samesample").
{ok,samesample}
2> samesample:same(3,3).
true
3> samesample:same(3,4).
false
接著來討論用函數當參數.
這裡會先使用內建函數庫的lists.
我們使用shell,直接在shell中定義一個函數,用來判斷數字是否為偶數.
4> Even = fun(X) -> (X rem 2) =:= 0 end.
#Fun<erl_eval.6.90072148>
5> Even(20).
true
6> Even(17).
false
接著使用lists的map與filter函數,對List使用Even當函數傳遞進去以作為運算依據.
7> lists:map(Even, [99,66,77,93,256]).
[false,true,false,false,true]
8> lists:filter(Even, [99,66,77,93,256]).
[66,256]
可以看到Even發揮作用.