最近在学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传入的是列表的值
本文介绍了Erlang编程语言中的匿名函数,通过书中的例子解析了匿名函数的工作原理,特别是其闭包特性。此外,还提供了一个关于如何使用匿名函数实现特定功能的题目和解答。
421

被折叠的 条评论
为什么被折叠?



