注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

erlang列表速构  

2014-08-08 23:58:36|  分类: Erlang |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
速构是一种用于描述作用于集合或元素序列(如列表)上的运算的紧促记法。比如数学中的{x|x?N,x>0}便是一个例子。“所有属于自然数集合(由N表示)且大于零的x值"----也就是所有正整数.
1.列表速构记法
     erlang是一门语言不是数学。我们可以在语法中融入相同的思想,但必须更加具体。尤其是,元素的顺序和选用的数据结构都显得更为重要。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/






  评论这张
 
阅读(531)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017