我们直接看一段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作为参数的函数就叫 高阶函数
介绍一个比较有用的,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] %%输出计算结果
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.
#Fun6.80484245>
%% 因为MakeTest 的返回值是一个函数, 所以 IsFruit也是一个函数, 并且是判断X是否在, Fruit 这个列表的函数.
7> IsFruit = MakeTest(Fruit).
#Fun6.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
比较常见