Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1903163
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: LINUX

2011-03-10 13:02:03

   先看一个Erlang的规定:在Eralng中,同一个模块中的两个函数,如果她们同名但是它们的目(arity)不同,这样的两个函数被认为是完全不同的两个函数。通常情况下,这样的函数被用作辅助函数。
   fun函数就是一个匿名函数(因为他自己没有名字),但就这个匿名函数,用处却是很大的。fun既可以作为函数的参数,也可以作为函数(或者自己本身fun)的返回结果。
   现在,我们再来看一下fun函数的简单使用:

4> Triple = fun(X) -> 3*X end.
#Fun<erl_eval.6.13229925>
5> Triple(3).
9
6>

当我们定一个fun的时候,会出现#Fun<erl_eval...>之类的东西,我自己也不清楚,不过先不要管这个。我们继续往下看。

Triple = fun(X) -> 3*X end.
是定义一个fun,只有一个参数量,也就是只有一个目,在fun结束的时候,需要将end加在后面的。当我们要调用它的时候,直接使用Triple,然后加上参数就行了。

注:本博客的例子可能许多都是来自Joe Armstrong的《Erlang程序设计》一书,或者在原来基础上稍加改变。
   我们再来详细的学习这个fun:
1.用fun作为函数的参数
上面的例子是只有一个参数,相信大家都能看懂。现在看一下使用多个参数时的情景。

1> Hypot = fun(X, Y) -> math:sqrt(X*X + Y*Y) end.
#Fun<erl_eval.12.113037538>
2> Hypot(3, 4).
5.0
3>

很容易看懂吧,其中的math是一个模块,sqrt是其中的一个函数,是用来计算平方根的。
fun也可以有若干个不同的子句。
比如下面的星期转换:

3> Week = fun({monday}) -> {1};
3> ({tuesday}) -> {2}
3> end.
#Fun<erl_eval.6.13229925>
5> Week({monday}).
{1}
6>

2.以fun作为参数的函数
lists是标准库中的一个模块,从中导出的很多函数都是以fun作为参数的函数,比如,map,filter等。下面是一个测试:

1> L = [1, 2, 3, 4].
[1,2,3,4]
2> Double = fun(X) -> 2*X end.
#Fun<erl_eval.6.13229925>
3> lists:map(Double, L).
[2,4,6,8]
4> Even = fun(X) -> (X rem 2) =:= 0 end.
#Fun<erl_eval.6.13229925>
5> lists:filter(Even,L).
[2,4]
6> Even(8).
true
7> Even(7).
false
8> L.
[1,2,3,4]
9>

在这个例子当中,map的第一个参数即为fun。
3.
阅读(6543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~