erlang fun函数使用详解

先看一个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*+ 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


本文转载自:http://blog.chinaunix.net/uid-22566367-id-381999.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值