Erlang (fun函数 | 闭包 | Lambda表达式)
fun
fun函数能将变量的当前值封存起来。
Make fun
1 | %% 匿名fun函数 |
Apply fun
1 | case F(1, 2) of |
Difference
匿名fun函数与本Module函数别名fun函数,都依赖于代码的特定版本,在fun函数所属Module重新加载后就会失效,再次调用会抛出异常,fun函数不适合长期保存,若将fun函数以消息的形式发送给别的Erlang系统,接收方必须持有相同版本的代码才能调用。
跨Module函数别名fun函数则不依赖代码的特定版本,被调用时,总是指向被引用函数的最新版本,fun函数类型的值仅仅是函数的符号引用,因此可以被长期保存或者以消息的形式在Erlang系统间传递。
一般来说,只要能保证各Erlang节点的beam文件相同,fun函数作为参数传递就不会有问题。
Higher-Order Functions
高阶函数
将fun函数作为参数或者返回值
1 | which_is_bigger(List) -> |
1 | which_is_bigger({X, Y}) when X > Y -> |
Tail Recursion
1 | SumF = fun(_Self, [], Result) -> |
1 | SumF = fun(AllList) -> |
1 | Y = fun(M) -> |