Erlang函數
Erlang是一種函數式編程語言,因此我們重點來看看在 Erlang 中是函數是如何工作的。本章將介紹在 Erlang 中什麼都可以使用函數來完成。
定義函數
函數聲明的語法如下 -
語法
FunctionName(Pattern1… PatternN) ->
Body;
在這裏,
FunctionName − 函數名稱是一個原子(唯一性)
Pattern1… PatternN − 每個參數都是一個模式。參數的個數N是函數的參數數量。函數名稱名稱是由模塊、函數名和定義的參數數量是唯一的。即,具有相同的名稱並在相同的模塊中的兩個函數,但它們具有不同參數數量也算是兩種不同的函數。
Body − 一個子句主體是由以逗號分隔的表達式序列組成 (,)
下面的程序是使用函數的一個簡單的例子 -
示例
-module(helloworld).
-export([add/2,start/0]).
add(X,Y) ->
Z = X+Y,
io:fwrite("wn",[Z]).
start() ->
add(5,6).
對上述程序以下幾點需要注意-
我們定義兩個函數,一個函數爲 add ,它需要 2 個參數,另一個函數是 start ;
這兩個函數都使用 export 函數定義。如果我們不這樣做那麼將無法使用函數;
一個函數可以在另一個函數中調用。在這裏 start 函數中將調用 add 函數;
上面的代碼的輸出結果是 -
11
匿名函數
匿名函數是一個函數,但它沒有與任何名稱相關聯。在 Erlang 中有工具可以用來定義匿名函數。以下的程序是一個匿名函數的一個例子。
示例
-module(helloworld).
-export([start/0]).
start() ->
Fn = fun() ->
io:fwrite("Anonymous Function") end,
Fn().
對於上面的例子,有以下幾點需要注意 -
匿名函數是使用 fun() 關鍵字定義的
該函數被分配給一個名爲 Fn 的變量
該函數是通過變量名稱來調用的
上面的代碼的輸出結果是 -
Anonymous Function
使用多個參數的函數
Erlang函數可以使用零個或多個參數來定義。函數重載也是可以的,可以定義一個相同名稱的函數,只要它們具有不同數目的參數。在下面的例子中,demo函數的每個函數定義是使用多個參數來定義的。
示例代碼
-module(helloworld).
-export([add/2,add/3,start/0]).
add(X,Y) ->
Z = X+Y,
io:fwrite("wn",[Z]).
add(X,Y,Z) ->
A = X+Y+Z,
io:fwrite("wn",[A]).
start() ->
add(5,6),
add(5,6,6).
在上面的程序中,我們兩次定義 add 函數。但第一個 add 函數的定義使用兩個參數,第二個 add 函數的定義使用三個參數。
上面的代碼的輸出結果是 -
11
17
函數使用序列
在 Erlang 中函數也都有保護序列的能力。這些都不算什麼它只不過是一個表達式,只有當評估(計算)爲 true 時函數才運行。
使用保護序列函數的語法如下面的程序中所示。
FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;
在這裏,
FunctionName − 函數名稱是一個原子(唯一性)
Pattern1… PatternN − 每個參數都是一個模式。參數的個數N是函數的參數數量。函數名稱名稱是由模塊、函數名和定義的參數數量是唯一的。即,具有相同的名稱並在相同的模塊中的兩個函數,但它們具有不同參數數量也算是兩種不同的函數。
Body − 一個子句主體是由以逗號分隔的表達式序列組成 (,)
GuardSeq1 − 當函數被調用它獲取計算的表達式。
下面的程序是一個使用保護序列的函數的一個簡單例子。
示例代碼
-module(helloworld).
-export([add/1,start/0]).
add(X) when X>3 ->
io:fwrite("wn",[X]).
start() ->
add(4).
上面的代碼的輸出結果是 -
4
如果 add 函數被調用爲 add(3),該程序將會出現錯誤。