关于erlang 匿名函数的一些解读

本文介绍了Erlang编程语言中的匿名函数,通过书中的例子解析了匿名函数的工作原理,特别是其闭包特性。此外,还提供了一个关于如何使用匿名函数实现特定功能的题目和解答。

最近在学erlang,匿名函数部分理解了一会,做点记录

先引用一个书上的例子:

PrepareAlarm = fun(Room) ->
    io:format("Alarm set in ~s.~n",[Room]),
    fun() -> io:format("Alarm tripped in  ~s!Call Batman!~n",[Room]) end
end.

输出:#Fun<erl_eval.44.97283095>

AlarmReady = PrepareAlarm("Kitchen").

输出:Alarm set in Kitchen.
#Fun<erl_eval.45.97283095>.

AlarmReady().
输出 :Alarm tripped in  Kitchen!Call Batman!
ok

等等, 编蝠侠!这里到底发生了什么?嗯, 首先, 我们定义了一个匿名函
数,并把它赋给PrepareAlarm 。这个函数并没有运行。仅当调用
PrepareAlarm("bathroom ” ) 时,才会执行这个函数。就在那时,调用了函
数io:format/2, 它打印出了“ Alarm set in"文本。函数的第二个表达式(另
一个匿名函数)被返回给调用者,并赋值给AlarmReady。注意,在返回的这
个匿名函数中,Room 变量的值来自千它的“ 父” 函数(PrepareAlarm)。这
涉及一个称作闭包(closure) 的概念。不过,在介绍闭包之前, 我们需要先弄
清楚什么是作用域。

再来看个题 

有函数

map(_,[]) -> [];

map(F,[X|Xs]) -> [F(X)|map(F,Xs)].

设计匿名函数F1,使得map(F1(3),[1,2,3,4])的输出结果为[1.0,8.0,27.0,64.0]

直接上答案,解读看注释,应该很好理解

work1() -> 
    F1 = fun(M) ->
            fun(X) ->
                math:pow(X,M) end 
        end,
    map(F1(3),[1,2,3,4]).

% %  这里是相当于 F1= fun(M) {
%                         fun(X) {
%                             math:pow(X,M)
%                         }
%                     }(X)
%  F1(3)传参是到M里 ,map()里调用的直接是 "F1(3)"(X)这个函数,所以X传入的是列表的值 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值