来自:http://zfsgeek.blog.163.com/blog/static/20400908020121012104457436/
使用或者返回一个匿名函数的函数被称为高阶函数(Higer-order function)。普通的函数,它们递归是容易编写的,因为它们有个名字,你引用这个名字就可以了,而匿名函数没有名字,如何编写递归呢?
例子:
下面是一个计算一个list的累加和的匿名函数:
F = fun(This, [], Total) -> Total; (This, [H|T], Total) -> This(This, T, H+Total) end.
在erl的shell中输入:
1> F = fun(This, [], Total) -> Total; 1> (This, [H|T], Total) -> This(This, T, H+Total) end. #Fun<erl_eval.18.82930912> 2> F(F, [1,2,3], 0). 6
诀窍就是把匿名函数赋给F,然后在调用这个匿名函数时,把F作为参数传入进去。你可能会问,为什么在匿名函数里面无法使用符号F?那是因为定义这个函数时,F还不存在。
如果你觉的上面的函数还需要你知道如何调用递归的匿名函数,不是很方便,不妨多写一层,我在shell里输入:
1> G=fun(L) ->
1> F=fun(This, [], Total) -> Total;
1> (This, [H|T], Total) -> This(This, T, H+Total) end,
1> F(F, L, 0) end.
#Fun<erl_eval.6.82930912>
2> G([1,2,3]).
6
3>
这里G引用的匿名函数内嵌一个匿名函数,内部是递归调用。