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

上一篇: Erlang case語句 下一篇: Erlang模組