当前位置: 首页 > 教程 > Erlang >

Erlang函数

精华
小牛编辑
105浏览
2023-03-14
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),该程序将会出现错误。