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 函式的定義接受兩個引數,第二個接受三個引數。

上述程式的輸出將是:

輸出

11
17

帶守衛序列的函式

Erlang 中的函式也具有守衛序列的功能。這些只是表示式,只有當它們計算結果為真時,函式才會執行。

帶守衛序列的函式語法如下程式所示。

語法

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),程式將導致錯誤。

廣告
© . All rights reserved.