Erlang是一種眾所周知的函數(shù)式編程語(yǔ)言,因此您將看到許多關(guān)于函數(shù)如何在Erlang中工作的重點(diǎn)。本章介紹如何使用Erlang中的函數(shù)完成所有操作。
函數(shù)聲明的語(yǔ)法如下 :
FunctionName(Pattern1… PatternN) -> Body;
在這里,
FunctionName ? 函數(shù)名稱(chēng)是一個(gè)原子(唯一性)
Pattern1… PatternN ? 每個(gè)參數(shù)都是一個(gè)模式。參數(shù)的個(gè)數(shù)N是函數(shù)的參數(shù)數(shù)量。函數(shù)名稱(chēng)名稱(chēng)是由模塊、函數(shù)名和定義的參數(shù)數(shù)量是唯一的。即,具有相同的名稱(chēng)并在相同的模塊中的兩個(gè)函數(shù),但它們具有不同參數(shù)數(shù)量也算是兩種不同的函數(shù)。
Body ? 一個(gè)子句主體是由以逗號(hào)分隔的表達(dá)式序列組成 (,)
下面的程序是使用函數(shù)的一個(gè)簡(jiǎn)單的實(shí)例 -
-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ù)定義。如果我們不這樣做那么將無(wú)法使用函數(shù);
一個(gè)函數(shù)可以在另一個(gè)函數(shù)中調(diào)用。在這里 start 函數(shù)中將調(diào)用 add 函數(shù);
上面的代碼的輸出結(jié)果是 -
11
匿名函數(shù)
匿名函數(shù)是一個(gè)函數(shù),但它沒(méi)有與任何名稱(chēng)相關(guān)聯(lián)。在 Erlang 中有工具可以用來(lái)定義匿名函數(shù)。以下的程序是一個(gè)匿名函數(shù)的一個(gè)實(shí)例。
-module(helloworld). -export([start/0]). start() -> Fn = fun() -> io:fwrite("Anonymous Function") end, Fn().
對(duì)于上面的實(shí)例,有以下幾點(diǎn)需要注意 -
匿名函數(shù)是使用 fun() 關(guān)鍵字定義的
該函數(shù)被分配給一個(gè)名為 Fn 的變量
該函數(shù)是通過(guò)變量名稱(chēng)來(lái)調(diào)用的
上面的代碼的輸出結(jié)果是 -
Anonymous Function
使用多個(gè)參數(shù)的函數(shù)
Erlang函數(shù)可以使用零個(gè)或多個(gè)參數(shù)來(lái)定義。函數(shù)重載也是可以的,可以定義一個(gè)相同名稱(chēng)的函數(shù),只要它們具有不同數(shù)目的參數(shù)。在下面的實(shí)例中,demo函數(shù)的每個(gè)函數(shù)定義是使用多個(gè)參數(shù)來(lái)定義的。
-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ù)序列的能力。這些都不算什么它只不過(guò)是一個(gè)表達(dá)式,只有當(dāng)評(píng)估(計(jì)算)為 true 時(shí)函數(shù)才運(yùn)行。
使用保護(hù)序列函數(shù)的語(yǔ)法如下面的程序中所示。
FunctionName(Pattern1… PatternN) [when GuardSeq1]-> Body;
在這里,
FunctionName ? 函數(shù)名稱(chēng)是一個(gè)原子(唯一性)
Pattern1… PatternN ? 每個(gè)參數(shù)都是一個(gè)模式。參數(shù)的個(gè)數(shù)N是函數(shù)的參數(shù)數(shù)量。函數(shù)名稱(chēng)名稱(chēng)是由模塊、函數(shù)名和定義的參數(shù)數(shù)量是唯一的。即,具有相同的名稱(chēng)并在相同的模塊中的兩個(gè)函數(shù),但它們具有不同參數(shù)數(shù)量也算是兩種不同的函數(shù)。
Body ? 一個(gè)子句主體是由以逗號(hào)分隔的表達(dá)式序列組成 (,)
GuardSeq1 ? 當(dāng)函數(shù)被調(diào)用它獲取計(jì)算的表達(dá)式。
下面的程序是一個(gè)使用保護(hù)序列的函數(shù)的一個(gè)簡(jiǎn)單實(shí)例。
-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ò)誤。