Erlang(5):控制结构when,if,case,for

控制结构,其实可以分成两种,一种是循环,另一种是选择分支。

1.for循环的实现
for(Max, Max, F)->[F(Max)];        
for(I, Max, F)->[F(I)|for(I+1, Max, F)].
在Erlang Shell里面声明这个for()函数会报错,暂时不深究,反正很少会用到shell编写函数。
再调用:
22> c(test).
{ok,test}
23> test:for(1,10,fun(X)->X*X end.
* 1: syntax error before: '.'
23> test:for(1,10,fun(X)->X*X end).
[1,4,9,16,25,36,49,64,81,100]

2.列表求和
%求和
sum([H|T])->H + sum(T);
sum([])->0.
要记得在export出加上函数,声明为公开的。


3.映射,对每一个元素执行处理,只是个数学的概念,真是好久没有听说过了。
其实就是一个for循环,更加像C++的for_each。
-module(test). %模块声明,模块名必须与文件名相同。
-export([for/3,for/2,sum/1]). %导出声明,声明可以外部使用的函数


%for循环
%按数值执行N次循环
for(Max, Max, F)->[F(Max)];  
for(I, Max, F)->[F(I)|for(I+1, Max, F)].
%函数映射,对每一个函数元素执行处理
for(_,[])->[];
for(F, [H|T])->[F(H)|for(F,T)].


%求和
sum([H|T])->H + sum(T);
sum([])->0.
试了好久,继续用for这个函数名是可以的。
因为参数个数不同,相当于一个新的函数。仅仅只是名字相同而已。
让编译器自动匹配就行了。
23> A = test:for(1,10,fun(X)->X end).
[1,2,3,4,5,6,7,8,9,10]
24> test:for(fun(X)->X*X end, A).    
[1,4,9,16,25,36,49,64,81,100]

4.导入标准库的函数
-import(lists, [map/2, sum/1]).
下面就可以直接使用了。


5.列表推导
[F(X) || X <- L].
按照F(X)来创建列表,X从L中抽取,可以通过匹配模式来抽取指定类型的元素


6.内置函数,简称为BIF(built-in function)
提供操作系统的接口,
执行一些无法用Erlang编写或者编写后非常低效的操作。
官网http://erlang.org/doc/man/erlang.html


7.关卡(guard)
max(X,Y) when X>Y -> X;
max(X,Y) ->Y.
这个when语句就是关卡,关卡放在函数头部。
可以有多个关卡,用“,”分隔,是并操作,用“;”分隔,表示或操作。
orelse跟C++的||语义才是相同的,前面判断正确了,后面就不会求值了。
andalso跟C++的&&语义是相同的,前面为false,后面的就不会求值了。

8.case表达式
为了不总是需要些一个函数而加的。
case Expression of
Pattern1 [when Guard1]-> Expr_seq1;
Pattern2 [when Guard2]-> Expr_seq2;
...
end

9.if表达式
if
Guard1 -> Expr_seq1;
Guard2 -> Expr_seq2;
...
end

总结一下:
循环可以通过函数进行递归来实现。这样肯定会比C++慢的,而且需要的空间肯定也更多。
就看编译器对函数堆栈的优化做得如何了。不过肯定会慢一点的。
至于分支结构,其实就是if和switch。Erlang实现了if,还有case表达式。
因为函数的编写方式比较特别,多了个when表达式。















posted @ 2017-01-16 15:44  肥宝游戏  阅读(781)  评论(0编辑  收藏  举报