Erlang学习笔记(3) -- 高阶函数 与 抽象流程控制

匿名函数

我们直接看一段erlang代码吧 (这里代码前面有>符号,指的是在命令行直接执行)

> Double = fun(X)->2*X end.
> Double(2).
> 4

这里fun(X) 是一个匿名行数
Double 相当于一个 函数对象, 跟js 里面 函数对象概念比较类似,

//跟上面的erlang 相比,erlang实在是太简洁了,没有一丝多余的东西~
var d = function(X){
 return X*2; 
 }; 

erlang也可以把函数对象作为其他函数的参数, 或者返回一个函数对象,
这种返回fun或者接受fun作为参数的函数就叫 高阶函数

接受fun作为参数的函数

介绍一个比较有用的,list:map方法,
list是标准库里面的一个模块(这让我想到C++ STL 里面似乎也有list这种东西= =)

%%接上面的Double方法,这里是把列表里面的对象,全部执行Double方法, 并返回处理后的列表
> L=[1,2,3,4].
[1,2,3,4]       
> lists:map(Double,L).
[2,4,6,8]       %%输出计算结果

返回fun的函数

lists:member(X,L)
首先说下是判断 X是否在列表L里面的函数

%%定义一个列表
5> Fruit =[apple, pear, orange].
[apple,pear,orange]
%%定义一个MakeTest函数, 这个函数返回一个测试匿名函数
%%匿名函数会判断X是否在L里面
6> MakeTest = fun(L) -> (fun(X)->lists:member(X,L) end ) end.
#Fun<erl_eval.6.80484245>
%% 因为MakeTest 的返回值是一个函数, 所以 IsFruit也是一个函数, 并且是判断X是否在, Fruit 这个列表的函数.
7> IsFruit = MakeTest(Fruit).
#Fun<erl_eval.6.80484245>
8> IsFruit(a).
false
9> IsFruit(pear).
true
10> IsFruit(apple).
true
11> IsFruit(dog).
false

这个语法的确让人觉得很玄乎, 其实就是相当于是返回函数指针的函数
后面用起来了,估计会慢慢理解吧….

抽象流程控制

大家会觉得, 我一直都在讲各种函数, 而没有流程控制之类的for while if switch 语句,
这是因为erlang根本就没有这些概念, 取而代之就是使用函数, 模式匹配代替
比如我们要用for 语句:

%%
for(Max,Max,F) -> [F(Max)];
%%匹配
for(I,Max,F)   -> [F(I)|for(I+1,Max,F)].

不过据说这种手写流程控制的情况不多, 一般使用原生的
lists:map
lists:filter
lists:partition
比较常见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值