我也学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的函数

  

  

原文地址:https://www.cnblogs.com/church/p/2591957.html