Erlang 函數(shù)

Erlang是一種眾所周知的函數(shù)式編程語(yǔ)言,因此您將看到許多關(guān)于函數(shù)如何在Erlang中工作的重點(diǎn)。本章介紹如何使用Erlang中的函數(shù)完成所有操作。

定義函數(shù)

函數(shù)聲明的語(yǔ)法如下 :

語(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ò)誤。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清