📜  Erlang-函数

📅  最后修改于: 2020-11-04 05:50:36             🧑  作者: Mango


Erlang被称为函数式编程语言,因此您可能希望看到很多关于函数在Erlang中如何工作的强调。本章介绍使用Erlang中的功能可以完成的全部工作。

定义功能

函数声明的语法如下-

句法

FunctionName(Pattern1… PatternN) ->
Body;

哪里,

  • FunctionName-函数名称是一个原子。

  • Pattern1…PatternN –每个参数都是一个模式。参数的数量,N是该函数的元数。函数由模块名称,函数名称和属性唯一定义。即,具有相同名称和相同模块但具有不同Arity的两个函数是两个不同的函数。

  • -甲子句体由表达式序列的由逗号(,)隔开:

以下程序是使用功能的简单示例-

-module(helloworld). 
-export([add/2,start/0]). 

add(X,Y) -> 
   Z = X+Y, 
   io:fwrite("~w~n",[Z]). 
   
start() -> 
   add(5,6).

关于上述程序,应注意以下几点:

  • 我们定义了两个函数,一个叫做add ,它带有两个参数,另一个是start函数。

  • 这两个函数都用export函数定义。如果我们不这样做,将无法使用函数。

  • 一个函数可以在另一个函数内部调用。在这里,我们呼吁从一开始的函数的附加函数。

上面程序的输出将是-

输出

11

匿名函数

匿名函数是一个函数,它没有与之关联的名称。 Erlang具有定义匿名函数的功能。以下程序是匿名函数的示例。

-module(helloworld). 
-export([start/0]). 

start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().

关于以上示例,需要注意以下几点-

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

  • 该功能分配给一个名为Fn的变量。

  • 通过变量名称调用函数。

上面程序的输出将是-

输出

Anonymous Function

具有多个参数的函数

可以使用零个或多个参数定义Erlang函数。函数重载也是可能的,其中您可以多次定义具有相同名称的函数,只要它们具有不同数量的参数即可。

在以下示例中,为每个函数定义使用多个参数定义了函数演示。

-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函数。但是第一个添加函数的定义包含两个参数,第二个添加函数三个参数。

上面程序的输出将是-

输出

11
17

具有保护序列的功能

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

以下程序显示了带有保护序列的函数的语法。

句法

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

哪里,

  • FunctionName-函数名称是一个原子。

  • Pattern1…PatternN-每个参数都是一个模式。参数的数量,N是该函数的元数。函数由模块名称,函数名称和属性唯一定义。即,具有相同名称和相同模块但具有不同Arity的两个函数是两个不同的函数。

  • -甲子句体由它们通过逗号(,)分隔的表达式序列组成。

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