我也学erlang(三)
开胃菜:
同名不同目的函数:所谓目就是指函数的参数。它们会被认为是两个不同的函数,除了它们的名字恰巧相同之外,它们彼此没有再没有任何联系。
正题:
fun:
fun就是一个匿名函数,所谓匿名,是因为它没有名字。我们来做点实验,先定义一个fun函数,然后把它赋给Z。
11> Z=fun(X)->2*X end. #Fun<erl_eval.6.111823515>
当定义fun函数时,系统通常会打印出来一串奇怪的数字,先不用管他。
输入:
12> Z(2).
4
fun可以拥有任意数量的参数。比如:
13> Hypot=fun(X,Y)->math:sqrt(X*X+Y*Y) end. #Fun<erl_eval.12.111823515> 14> Hypot(3,4). 5.0
Erlang是一种函数式编程语言,因此,除了几个别情况,fun既可以作为函数的返回值,也可以作为函数的参数。这些以fun为参数或者返回fun的函数,称为高阶函数。
以fun为参数的函数
lists是标准库中的一个模块,从中导出的很多函数都是以fun作为参数的。其中,最有用的是lists:map(F,L).这个函数将fun F应用到列表中的每个元素上,然后返回一个列表。
假设刚刚的Z函数我们重新定义为Double。
15> Double=Z. #Fun<erl_eval.6.111823515> 16> L=[1,2,3,4]. [1,2,3,4] 17> lists:map(Double,L). [2,4,6,8]
另一个有用的函数是lists:filter(P,L),它返回一个新列表,新列表由满足条件P(E)的元素组成。
我们定义一个函数Even(X),
18> Even=fun(X)->(X rem 2)=:=0 end. #Fun<erl_eval.6.111823515> 19> Even(8). true 20> Even(7). false 21> lists:map(Even,[1,2,3,4,5,6,7,8]). [false,true,false,true,false,true,false,true] 22> lists:filter(Even,[1,2,3,4,5,6,7,8]). [2,4,6,8]
返回fun的函数