(map和foreach的区别)Erlang编程入门之高端函数
来源:互联网 发布:linux ping 命令参数 编辑:程序博客网 时间:2024/04/29 04:41
http://tech.it168.com/jd/2008-01-30/200801302323777.shtml
Erlang和其他的函数式编程语言一样,有一些高端的函数,我们下面就来看看这部分的内容:
90> Xf = fun(X) -> X * 2 end. #Fun 91> Xf(5). 10
我们在这里定义了一个函数,其功能是将输入的数值乘以2. 于是我们调用Xf(5)得到结果10.两个在日常工作中有用的函数是 foreach和map,定义如下:
foreach(Fun, [First|Rest]) -> Fun(First), foreach(Fun, Rest); foreach(Fun, []) -> ok. map(Fun, [First|Rest]) -> [Fun(First)|map(Fun,Rest)]; map(Fun, []) -> [].
这两个函数都在模块lists中。foreach需要一个列表作为输入,然后对每个列表元素应用一次fun函数。而map则创建一个新的列表来保存被fun函数作用过的列表元素。回到shell中,我们使用map 和fun对列表中的每个元素都加上3:
92> Add_3 = fun(X) -> X + 3 end. #Fun 93> lists:map(Add_3, [1,2,3]). [4,5,6]
现在让我们输出城市的温度列表:
95> Print_City = fun({City, {X, Temp}}) -> io:format("~-15w ~w ~w~n", [City, X, Temp]) end. #Fun 96> lists:foreach(Print_City, [{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]). moscow c -10 cape_town f 70 stockholm c -4 paris f 28 london f 36
ok
我们现在定义一个fun函数,来将列表中的华氏度全部转换为摄氏度:
-module(tut13). -export([convert_list_to_c/1]). convert_to_c({Name, {f, Temp}}) -> {Name, {c, trunc((Temp - 32) * 5 / 9)}}; convert_to_c({Name, {c, Temp}}) -> {Name, {c, Temp}}. convert_list_to_c(List) -> lists:map(fun convert_to_c/1, List). 98> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]). [{moscow,{c,-10}}, {cape_town,{c,21}}, {stockholm,{c,-4}}, {paris,{c,-2}}, {london,{c,2}}]
convert_to_c函数的功能和上面相同,只不过我们使用了一个fun:
lists:map(fun convert_to_c/1, List)
但我们使用一个某处定义的函数作为fun时,我们应该明确的知道它的方法名和参数数量(Function/Arity)。所以在map中我们写 lists:map(fun convert_to_c/1,List)。所以你可以看到 convert_list_to_c变短了,变得更加容易阅读理解了。
标准模块lists同样包含了函数sort(Fun,List),这里的fun 带有两个参数。如果第一个参数小于第二个参数则fun应该返回true ,否则应该返回false。我们将其添加到convert_list_to_c中:
-module(tut13). -export([convert_list_to_c/1]). convert_to_c({Name, {f, Temp}}) -> {Name, {c, trunc((Temp - 32) * 5 / 9)}}; convert_to_c({Name, {c, Temp}}) -> {Name, {c, Temp}}. convert_list_to_c(List) -> New_list = lists:map(fun convert_to_c/1, List), lists:sort(fun({_, {c, Temp1}}, {_, {c, Temp2}}) - > Temp1 < Temp2 end, New_list). 99> c(tut13). {ok,tut13} 100> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]). [{moscow,{c,-10}}, {stockholm,{c,-4}}, {paris,{c,-2}}, {london,{c,2}}, {cape_town,{c,21}}]
在sort中我们使用fun:
fun({_, {c, Temp1}}, {_, {c, Temp2}}) -> Temp1 < Temp2 end,
这里我们引入了一个概念——匿名变量"_"(anonymous variable)。这是一种当获取一个值时的缩写的形式,但是我们将忽略这个值。我们可以在任何地方使用这个匿名特性,不仅仅是在fun 中。
- (map和foreach的区别)Erlang编程入门之高端函数
- forEach()和map()的区别:
- forEach 和 map 的区别
- forEach()和map()的区别
- scala中map和foreach的区别
- map和foreach遍历的区别
- js遍历函数forEach()、map()、every()和some()的区别实例
- JS1.6数组新增函数map与forEach的区别
- forEach和map和for方法的区别
- jq方法each、forEach和map的区别
- javascript array.forEach()和array.map()的区别
- Swift 函数式编程: map 和 flatMap的区别
- 原生JS forEach()和map()遍历的区别以及兼容写法,jQuery $.each()和$.map()遍历
- Erlang编程入门之并发编程-进程
- Scala常用函数式编程之map、foreach、flatten、flatmap、filter、zip、zipWithIndex
- map, foreach, for的用法区别
- js map()与forEach()遍历的区别
- JS中的forEach、$.each、map的区别
- cairo的代码
- Unix下导出oracle数据库文件及在windows下导入不同oracle版本的数据库
- swing小计算器2.0
- DLL(Dynamic Link Libraries) 专题
- iPhone 开发常用控件
- (map和foreach的区别)Erlang编程入门之高端函数
- SVM多元分类策略
- linux查看端口命令
- Memcached安装指南(linux)
- Hibernate的generator属性
- GBK Character Map
- c++ 中string用法总结
- 网站开发用到的工具
- Myeclipse打开就出错Could not create the Java virtual machine