Erlang Erlang 入门-命名函数

DavidAlphaFox · 发布于 2017年09月23日 · 273 次阅读
84794b

Erlang函数

在上一篇教程中,我们介绍了Erlang的递归和模式匹配,其中就可以看到Erlang的函数是如何定义的。Erlang的函数有两类,一类是命名函数,另一类是匿名函数(高阶函数)。本篇将介绍命名函数,匿名函数(高阶函数)将会放在下一篇介绍。为了定义函数就需要先理解Erlang的一个基础类型原子。

Erlang的原子类型

Erlang虽然是一个动态类型的语言,但是Erlang中还是有类型定义的。原子类型就会Erlang的基础数据类型之一,Erlang的原子可以被认为是非常特殊的变量,它的字面含义就是它的值。Erlang原子语法要求是,小写字母开头的标识或者是使用单引号括(‘’)括起的子串。例如,atom,atom1,atom_n和‘This is an atom’都是合法的原子。

虽然可以将原子认为是特殊的变量,但是原子毕竟不是变量。Erlang中原子的数量是有限的,一个原子一旦被定义直到Erlang虚拟机退出为止都不会被销毁。虽然这个数量是有限制的,但是可以在Erlang虚拟机启动的时候,通过+t这个参数去修改Erlang虚拟机中原子数量的上限。同时,需要注意的是,模块名称和函数名称都是原子。

命名函数语法

Erlang中定义命名函数的规则是这样的:原子类型的函数名,后面跟随着小括号,小括号内可以放置任意多个(不能多于255个)的变量或常量,这些变量和常量之间用逗号隔开,在括号后面放置->,在函数体的最后一个语句以句号结尾。下面就是一个最简答的例子:

greet(_, Name) ->
  io:format("Hello, ~s!", [Name]).

在上一篇的例子中,可以看到以分号尾的函数,这就是Erlang函数特点之一。Erlang可以使用以分号结束但具有相同名字和相同数量参数函数作为Erlang函数的分句,但是这些分句必须放在最终以句号结尾的函数前面,中间不能有任何不同名字和不同数量参数的函数分句或函数存在。如下面的例子:

greet(male, Name) ->
  io:format("Hello, Mr. ~s!", [Name]);
greet(female, Name) ->
  io:format("Hello, Mrs. ~s!", [Name]);
greet(_, Name) ->
  io:format("Hello, ~s!", [Name]).

Erlang的函数的特点之二,同名函数只要参数数量不同,Erlang会认为是两个完全不同的函数。如下面的例子:

factorial(N) -> factorial(N,1).
factorial(0,Acc) -> Acc;
factorial(N,Acc) when N > 0 -> factorial(N-1,N*Acc).

Erlang的函数的特点之三,函数哨位,可以在函数后面跟随一个逻辑判断语句,在函数执行函数体之前对传入的参数进行判断看是否符合函数体执行的条件。如下面的例子:

age_can_drive(X) when X >= 16, X =< 104 ->
  true;
age_can_drive(_) ->
  false.

但是需要注意的是,函数的哨位不但可以只用逻辑判断,还可以使用数学操作符和类型函数。但是可以使用的函数是有限制的,哨位中使用的函数是无法使用用户自定义的函数。

共收到 0 条回复
84794b DavidAlphaFox Erlang 入门-模块和进程 中提及了此贴 12月26日 20:29
需要 登录/注册 后方可回复, 如果你还没有账号请点击这里 注册