iT邦幫忙

DAY 6
3

蠻可愛的 Erlang 與 Elixir系列 第 6

再探模式比對以及用函數當函數參數

  • 分享至 

  • xImage
  •  

一般程序性程式語言會有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發揮作用.


上一篇
模式比對
下一篇
erlang 7 List操作
系列文
蠻可愛的 Erlang 與 Elixir30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言