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("~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),該程式將會出現錯誤。