Erlang - 函数
Erlang 被称为函数式编程语言,因此您会期望看到大量强调函数在 Erlang 中如何工作的内容。 本章涵盖了使用 Erlang 中的函数可以完成的所有操作。
定义函数
函数声明的语法如下 −
语法
FunctionName(Pattern1… PatternN) -> Body;
其中,
FunctionName − 函数名称是一个原子。
模式1…模式N − 每个参数都是一个模式。 参数的数量 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 函数。
这两个函数都是使用导出函数定义的。 如果不这样做,我们将无法使用该功能。
一个函数可以在另一个函数内部调用。 这里我们从 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 − 函数名称是一个原子。
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),程序将导致错误。