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("~w~n",[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("~w~n",[Z]). add(X,Y,Z) -> A = X+Y+Z, io:fwrite("~w~n",[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("~w~n",[X]). start() -> add(4).
上面的代碼的輸出結果是 -
4
如果 add 函數被調用為 add(3),該程式將會出現錯誤。
上一篇:
Erlang case語句
下一篇:
Erlang模組