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("AnonymousFunction")end,Fn().

对于上面的实例,有以下几点需要注意-

  • 匿名函数是使用fun()关键字定义的

  • 该函数被分配给一个名为Fn的变量

  • 该函数是通过变量名称来调用的

上面的代码的输出结果是-

AnonymousFunction

使用多个参数的函数

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函数的定义使用三个参数。

上面的代码的输出结果是-

1117

函数使用序列

在Erlang中函数也都有保护序列的能力。这些都不算什么它只不过是一个表达式,只有当评估(计算)为true时函数才运行。

使用保护序列函数的语法如下面的程序中所示。

FunctionName(Pattern1…PatternN)[whenGuardSeq1]->Body;

在这里,

  • FunctionName−函数名称是一个原子(唯一性)

  • Pattern1… PatternN−每个参数都是一个模式。参数的个数N是函数的参数数量。函数名称名称是由模块、函数名和定义的参数数量是唯一的。即,具有相同的名称并在相同的模块中的两个函数,但它们具有不同参数数量也算是两种不同的函数。

  • Body−一个子句主体是由以逗号分隔的表达式序列组成(,)

  • GuardSeq1− 当函数被调用它获取计算的表达式。

下面的程序是一个使用保护序列的函数的一个简单实例。

示例代码

-module(helloworld).-export([add/1,start/0]).add(X)whenX>3->io:fwrite("~w~n",[X]).start()->add(4).

上面的代码的输出结果是-

4

如果add函数被调用为add(3),该程序将会出现错误。

编辑于2024-05-20 13:19