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, ).
下面就可以直接使用了。

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表达式。

原文链接: https://www.cnblogs.com/fablegame/p/6430190.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/247873

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午2:30
下一篇 2023年2月14日 上午2:31

相关推荐