Erlang(5):控制结构when,if,case,for
控制结构,其实可以分成两种,一种是循环,另一种是选择分支。
1.for循环的实现
再调用:
2.列表求和
%求和
3.映射,对每一个元素执行处理,只是个数学的概念,真是好久没有听说过了。
其实就是一个for循环,更加像C++的for_each。
因为参数个数不同,相当于一个新的函数。仅仅只是名字相同而已。
让编译器自动匹配就行了。
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)
可以有多个关卡,用“,”分隔,是并操作,用“;”分隔,表示或操作。
orelse跟C++的||语义才是相同的,前面判断正确了,后面就不会求值了。
andalso跟C++的&&语义是相同的,前面为false,后面的就不会求值了。
8.case表达式
为了不总是需要些一个函数而加的。
9.if表达式
总结一下:
循环可以通过函数进行递归来实现。这样肯定会比C++慢的,而且需要的空间肯定也更多。
就看编译器对函数堆栈的优化做得如何了。不过肯定会慢一点的。
至于分支结构,其实就是if和switch。Erlang实现了if,还有case表达式。
因为函数的编写方式比较特别,多了个when表达式。
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表达式。
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2