意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

erlang列表速构

来源:恒创科技 编辑:恒创科技编辑部
2024-02-03 21:50:59


速构是一种用于描述作用于集合或元素序列(如列表)上的运算的紧促记法。比如数学中的{x|x?N,x>0}便是一个例子。“所有属于自然数集合(由N表示)且大于零的x值"----也就是所有正整数.

1.列表速构记法


erlang列表速构


列表速构。语法也要稍作修饰。假设你有一个现在的整数列表,正负整数都有,通过以下方法你可以便捷地从中创建出一个仅含正整数的新列表(它们在列表中的顺序仍然保留):


[x|| x <- ListOfIntegers, x>0]


?,我们在用左箭头<-来表示生成器;||右侧除生成器以外的部分便是约束条件,如x>0.模板部分可以是作意表达式,并可以使用绑定于竖线右侧或列表速构之外的作意变量(前者如由生成器绑定的变量x).


另外,如果速构中指定多个生成器,便会像写嵌套循环一样产生元素的各种组合。这种用法的用处不多,但有时也能用上。


2.映射,过滤和模式匹配


单个列表速构可以用于完成各种映射和过滤运算的组合,基中映射是指针对元素完成一些远算后再将运算结果放入结果列表。例如,以下的列表速构能够从源列表中选出所有的正偶数(rem表示求余)并求出它们的平方:


[math:pow(x,2) || x<- ListOfIntegers,x>0,x rem 2 ==0]


但列表速构最强大的能力还是源自模式匹配。在生成器中,<-箭头左侧不一定是变量-----可以是任意模式,跟匹配运算符(=)差不多。这意味着生成器本身就内置了一个约束条件:只有与模式相匹配的元素才在考虑范围内;其余元素统统忽略不计。此外,借助模式你还可以抽取出元素的不同组成部分并将之用在约束条件或模板中。假设你有一个以元组为元素的列表。你可以从中选出那些面积不小于10的矩形,并创建一个与之相对诮的面积列表:


[{area,H*W} || {rectangle, H ,W} <- Shapes, H*W >= 10]


使用列表时,可以尽可能的使用列表速构。除了效率因素外,它也是这类运算最紧促和可读的表达形式。


《ErlangOTP并发编程实践》

关于列表速构,下边我写一个我自已作的函数,用这个函数可以生成一个自然数列表。使用这种形式的方法来生成列表,一定会很方便,下边是正文:

-module(makelist)


%%-compile(export_all).

-export([creatList/1,creatListRange/2]).


%%这里用到了一个反转列表lists:reverse([1, 2, 3, 4]).

creatList(MaxNumber) ->lists:reverse(listCreat(MaxNumber)).


listCreat(N) when N > 0 -> [N|listCreat(N-1)];

listCreat(0) ->


%%从一个数From到数To的自然数列表

creatListRange(From,To) -> [From+X || X <- creatList(To - From)].


好了,上边是这个模块,下边是我进行测试时生成的自然数列表:

Eshell V6.1

(game@woodcols-iMac)1> makelist:creatList(5).

[1,2,3,4,5]

(game@woodcols-iMac)2>makelist:creatListRange(10, 15).

[11,12,13,14,15]

(game@woodcols-iMac)3>

之所以要用这个列表,是因为,我想创建一组进程,进程要起一个作为标记的名字,而这个名字要有一定的规律。当我有了自然数列表之后,我可以再使用gen_sup的OTP框架中的start_child/2函数来创建一组simple_one_for_one类型的进程,再使用ets表,将这些进程pid和我的这个列表中的元素对应保存起来。之后我要取simple_one_for_one的不管那个进程,我就可以自由处理了。

创建进程的时候,我只要调用下边这个函数就可以了。他用使用列表中的所有数据作为参数,然后传递给Pred函数。

lists:all(Pred, List) -> boolean()

转载请注明出处:​​http://fengmm521.blog.163.com/blog/static/25091358201478113548988/​​








上一篇: erlang项目常见OTP行为模式 下一篇: 手机怎么远程登录云服务器?