Erlang - 函数


Erlang 被称为函数式编程语言,因此您会期望看到大量强调函数在 Erlang 中如何工作的内容。本章涵盖了使用 Erlang 中的函数可以完成的所有操作。

定义函数

函数声明的语法如下 -

句法

FunctionName(Pattern1… PatternN) ->
Body;

在哪里,

  • FunctionName - 函数名称是一个Atomics。

  • Pattern1…PatternN - 每个参数都是一个模式。参数的数量 N 是函数的元数。函数由模块名称、函数名称和元数唯一定义。也就是说,两个具有相同名称且位于同一模块中但具有不同参数的函数是两个不同的函数。

  • 主体- 子句主体由一系列用逗号 (,) 分隔的表达式组成:

以下程序是使用函数的简单示例 -

例子

-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函数。

  • 这两个函数都是用导出函数定义的。如果我们不这样做,我们将无法使用该功能。

  • 一个函数可以在另一个函数内部调用。这里我们从 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 函数的定义接受两个参数,第二个函数接受三个参数。

上述程序的输出将是 -

输出

11
17

具有保护序列的函数

Erlang 中的函数还具有保护序列的能力。这些只不过是表达式,只有当计算结果为 true 时才会导致函数运行。

具有保护序列的函数的语法如以下程序所示。

句法

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

在哪里,

  • FunctionName - 函数名称是一个Atomics。

  • Pattern1…PatternN - 每个参数都是一个模式。参数的数量 N 是函数的元数。函数由模块名称、函数名称和元数唯一定义。也就是说,两个具有相同名称且位于同一模块中但具有不同参数的函数是两个不同的函数。

  • 主体- 子句主体由一系列用逗号 (,) 分隔的表达式组成。

  • 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),程序将导致错误。