前面有提到,在erlang中List扮演了重要的角色.
也在模式比對的範例中,使用了List.
今天來看一下,erlang中的內建函數(BIFs, Build-In Functions),
對List的操作或取得訊息.
1> MyList = [1,2,3,4].
[1,2,3,4]
2> length(MyList).
4
3> hd(MyList).
1
4> tl(MyList).
[2,3,4]
length()是回報List長度,這部份與一般程式語言都相同.
hd()是取出List開頭第一個元素.
tl()是除了第一個元素以外,其他的元素.
這樣做有何用處呢?且讓我們繼續看下去.
接著來看erlang中,使用 | 運算子,在模式比對方式操作中,
做List的切割與合併.
先來看合併:
5> List2 = [2,3,4].
[2,3,4]
6> List3 = [1 | List2].
[1,2,3,4]
再來看切割:
7> [Head | Tail] = List3.
[1,2,3,4]
8> Head.
1
9> Tail.
[2,3,4]
繼續切割:
10> [NewHead | NewTail] = Tail.
[2,3,4]
11> NewHead.
2
也許大家看到這裡,會有疑惑.這樣切割,有何用處呢?
有沒有注意到,到目前為止,沒看到迴圈指令.
一般大家熟知的程式語言,是程序性的,迴圈指令相當重要.
筆者在小時候初學程式語言時,學到迴圈時,著實興奮啊,
可以用來反覆做事情,電腦的主要威力啊.
若得知erlang中,沒有迴圈指令.
不知大家表情是否會像星爺一樣?
在erlang中,我們可以自已很輕易的做一個山寨版的for出來.
請看
-module(myfor).
-export([for/3]).
for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I) | for(I+1, Max, F)].
編譯及執行:
12> c("myfor").
{ok,myfor}
13> myfor:for(1,10, fun(I) -> I end).
[1,2,3,4,5,6,7,8,9,10]
14> myfor:for(1,10, fun(I) -> I*I end).
[1,4,9,16,25,36,49,64,81,100]
可以依據函數的不同,產生不同的List出來.
只需兩行程式碼而已! 蠻可愛的erlang!