Erlang顺序编程之二 模块与函数2

基本的抽象单元:fun
fun定义:匿名函数,因为它们是没有名字的,通常用于作为高阶函数(可操作其他函数的函数)数据类型
shell中调用如下:
1> Double=fun(X) ->2*X end.
#Fun<erl_eval.6.52032458>
2> Double(2).
4
3> Hypot=fun(X,Y) ->math:sqrt(X*X+Y*Y) end.
#Fun<erl_eval.12.52032458>
4> Hypot(3,4).
5.0
如上述所示fun参数数量可由用户自定义,无限制

fun作为函数参数
以lists库(lists是标准库中的模块,其中包含很多以fun作为参数的函数)中lists:map(F,L)和lists:filter(P,L)为例,lists:map(F,L)返回值是一个列表,它通过将列表L中每个元素应用fun进行处理,lists:filter(P,L)返回值是
一个列表,与lists:map(F,L)不同的是,仅返回L中符合条件的元素(条件是对元素E而言P(E)为真)
lists:map(F,L)调用:
5> L=[1,2,3,4].
[1,2,3,4]
6> lists:map(Double,L).
[2,4,6,8]

lists:filter(P,L)调用:
7> Even=fun(X) ->(X rem 2)=:=0 end.
#Fun<erl_eval.6.52032458>
8> lists:filter(Even,L).
[2,4]
map和filter等函数能在一次调用里对整个列表执行某种操作,我们将它们成为一次一列表(list-at-time)式操作

深入:返回fun的函数
以下列代码作为参考
9> Fruit=[apple,pear,orange].
[apple,pear,orange]
10> MakeTest=fun(L) ->(fun(X) ->lists:member(X,L) end) end.
#Fun<erl_eval.6.52032458>
11> IsFruit=MakeTest(Fruit).
#Fun<erl_eval.6.52032458>
12> IsFruit(apple).
true
13> IsFruit(cat).
false
14> lists:filter(IsFruit,[cat,car,apple,orange,room]).
[apple,orange]
理解上述代码,首先需要理解fun函数返回值是那一部分
Double=fun(X) ->(X*2) end. 显然Double(X)返回值即为X*2,所以fun函数返回值就是括号内内容
MakeTest(Fruit)即为fun(Fruit) ->(fun(X) ->lists:member(X,Fruit) end) end.
MakeTest(Fruit)返回值为fun(X) ->lists:member(X,Fruit) end.
综上可得
IsFruit(X)可理解为lists:member(X,Fruit)

再添加一个例子,以下不做详细讲解
1> Mult=fun(Times) ->(fun(X) ->X*Times end) end.
#Fun<erl_eval.6.52032458>
2> Double=Mult(2).
#Fun<erl_eval.6.52032458>
3> Triple=Mult(3).
#Fun<erl_eval.6.52032458>
4> Double(2).
4
5> Triple(2).
6

课后知识补充:
1 在.erl文件中若添加-import(lists,[map/2,sum/1],则表示该文件导入lists模块里的map/2函数,在文件中需要调用map/2函数是,可直接用map(Fun,...)代替lists:map(Fun,...)的写法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值