鍍金池/ 教程/ Java/ Erlang函數(shù)
Erlang關(guān)系運(yùn)算符實(shí)例
Erlang決策
Erlang運(yùn)算符
Erlang if語句
Erlang Shell
Erlang循環(huán)(while和for)
Erlang函數(shù)
Erlang內(nèi)嵌if語句
Erlang模塊
Erlang多表達(dá)式
Erlang算術(shù)運(yùn)算符示例
Erlang位運(yùn)算符實(shí)例
Erlang變量
Erlang基礎(chǔ)語法
Erlang遞歸
Erlang邏輯運(yùn)算符實(shí)例
Erlang case語句
Erlang環(huán)境配置(開發(fā)環(huán)境)
Erlang數(shù)據(jù)類型
Erlang教程

Erlang函數(shù)

Erlang是一種函數(shù)式編程語言,因此我們重點(diǎn)來看看在 Erlang 中是函數(shù)是如何工作的。本章將介紹在 Erlang 中什么都可以使用函數(shù)來完成。

定義函數(shù)

函數(shù)聲明的語法如下 -

語法

FunctionName(Pattern1… PatternN) ->
Body;

在這里,

  • FunctionName ? 函數(shù)名稱是一個(gè)原子(唯一性)

  • Pattern1… PatternN ? 每個(gè)參數(shù)都是一個(gè)模式。參數(shù)的個(gè)數(shù)N是函數(shù)的參數(shù)數(shù)量。函數(shù)名稱名稱是由模塊、函數(shù)名和定義的參數(shù)數(shù)量是唯一的。即,具有相同的名稱并在相同的模塊中的兩個(gè)函數(shù),但它們具有不同參數(shù)數(shù)量也算是兩種不同的函數(shù)。

  • Body ? 一個(gè)子句主體是由以逗號(hào)分隔的表達(dá)式序列組成 (,)

下面的程序是使用函數(shù)的一個(gè)簡(jiǎn)單的例子 -

示例

-module(helloworld). 
-export([add/2,start/0]). 

add(X,Y) -> 
   Z = X+Y, 
   io:fwrite("~w~n",[Z]). 
   
start() -> 
   add(5,6).
對(duì)上述程序以下幾點(diǎn)需要注意-
  • 我們定義兩個(gè)函數(shù),一個(gè)函數(shù)為 add ,它需要 2 個(gè)參數(shù),另一個(gè)函數(shù)是 start ;
  • 這兩個(gè)函數(shù)都使用 export 函數(shù)定義。如果我們不這樣做那么將無法使用函數(shù);
  • 一個(gè)函數(shù)可以在另一個(gè)函數(shù)中調(diào)用。在這里 start 函數(shù)中將調(diào)用 add 函數(shù);
上面的代碼的輸出結(jié)果是 -
11

匿名函數(shù)

匿名函數(shù)是一個(gè)函數(shù),但它沒有與任何名稱相關(guān)聯(lián)。在 Erlang 中有工具可以用來定義匿名函數(shù)。以下的程序是一個(gè)匿名函數(shù)的一個(gè)例子。

示例

-module(helloworld). 
-export([start/0]). 

start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().
對(duì)于上面的例子,有以下幾點(diǎn)需要注意 -
  • 匿名函數(shù)是使用 fun() 關(guān)鍵字定義的
  • 該函數(shù)被分配給一個(gè)名為 Fn 的變量
  • 該函數(shù)是通過變量名稱來調(diào)用的
上面的代碼的輸出結(jié)果是 -
Anonymous Function

使用多個(gè)參數(shù)的函數(shù)

Erlang函數(shù)可以使用零個(gè)或多個(gè)參數(shù)來定義。函數(shù)重載也是可以的,可以定義一個(gè)相同名稱的函數(shù),只要它們具有不同數(shù)目的參數(shù)。在下面的例子中,demo函數(shù)的每個(gè)函數(shù)定義是使用多個(gè)參數(shù)來定義的。

示例代碼

-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 函數(shù)。但第一個(gè) add 函數(shù)的定義使用兩個(gè)參數(shù),第二個(gè) add 函數(shù)的定義使用三個(gè)參數(shù)。
上面的代碼的輸出結(jié)果是 -
11
17

函數(shù)使用序列

在 Erlang 中函數(shù)也都有保護(hù)序列的能力。這些都不算什么它只不過是一個(gè)表達(dá)式,只有當(dāng)評(píng)估(計(jì)算)為 true 時(shí)函數(shù)才運(yùn)行。
使用保護(hù)序列函數(shù)的語法如下面的程序中所示。
FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;

在這里,

  • FunctionName ? 函數(shù)名稱是一個(gè)原子(唯一性)

  • Pattern1… PatternN ? 每個(gè)參數(shù)都是一個(gè)模式。參數(shù)的個(gè)數(shù)N是函數(shù)的參數(shù)數(shù)量。函數(shù)名稱名稱是由模塊、函數(shù)名和定義的參數(shù)數(shù)量是唯一的。即,具有相同的名稱并在相同的模塊中的兩個(gè)函數(shù),但它們具有不同參數(shù)數(shù)量也算是兩種不同的函數(shù)。

  • Body ? 一個(gè)子句主體是由以逗號(hào)分隔的表達(dá)式序列組成 (,)

  • GuardSeq1 ? 當(dāng)函數(shù)被調(diào)用它獲取計(jì)算的表達(dá)式。

下面的程序是一個(gè)使用保護(hù)序列的函數(shù)的一個(gè)簡(jiǎn)單例子。

示例代碼

-module(helloworld). 
-export([add/1,start/0]). 

add(X) when X>3 -> 
   io:fwrite("~w~n",[X]). 

start() -> 
   add(4).
上面的代碼的輸出結(jié)果是 -
4
如果 add 函數(shù)被調(diào)用為 add(3),該程序?qū)?huì)出現(xiàn)錯(cuò)誤。