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),該程序將會出現錯誤。