- Erlang 教程
- Erlang - 首页
- Erlang - 概述
- Erlang - 环境
- Erlang - 基本语法
- Erlang - Shell
- Erlang - 数据类型
- Erlang - 变量
- Erlang - 运算符
- Erlang - 循环
- Erlang - 决策
- Erlang - 函数
- Erlang - 模块
- Erlang - 递归
- Erlang - 数字
- Erlang - 字符串
- Erlang - 列表
- Erlang - 文件 I/O
- Erlang - 原子
- Erlang - 映射
- Erlang - 元组
- Erlang - 记录
- Erlang - 异常
- Erlang - 宏
- Erlang - 头文件
- Erlang - 预处理器
- Erlang - 模式匹配
- Erlang - 保卫式
- Erlang - BIFs (内置函数)
- Erlang - 二进制
- Erlang - Fun (匿名函数)
- Erlang - 进程
- Erlang - 邮件
- Erlang - 数据库
- Erlang - 端口
- Erlang - 分布式编程
- Erlang - OTP (开放电信平台)
- Erlang - 并发
- Erlang - 性能
- Erlang - 驱动程序
- Erlang - Web编程
- Erlang 有用资源
- Erlang - 快速指南
- Erlang - 有用资源
- Erlang - 讨论
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("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 中的函数也具有守卫序列的功能。这些只是表达式,只有当它们计算结果为真时,函数才会运行。
带守卫序列的函数语法如下程序所示。
语法
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),程序将导致错误。