list的操作很灵活,特别是在erlang中,不仅库函数提供了大量的操作,而且利用匹配模式也能很好的对list数据进行操作,但是相对简单又快速的要数列表解析,
所谓的列表解析,其实就是将现有列表中的元素逐一进行操作然后生成一个新的列表 例如下面的代码
Eshell V5.9 (abort with ^G) 1> List = [1,2,3,4,5]. [1,2,3,4,5] 2> [2*X||X<-List]. [2,4,6,8,10] 3>
这其实很好理解,只是一种简单的规则。
在erlang中模式匹配无处不在,对于列表解析也是如此,我们放入一个格式统一的列表
踀4> List1 = [{1,first},{2,second}]. [{1,first},{2,second}] 5> [{X*2,Y}||{X,Y}<-List1]. [{2,first},{4,second}] 6>
这回按照我们预期的输出新的列表,那么下面来试验一下格式和内里元素类型不一致的列表会出现什么样的情况
6> [{X*2,thired}||{X,Y}<-List1]. [{2,thired},{4,thired}] 7> [{X*2,thired}||{X,thired}<-List1]. [] 8>
注意观察以上两段代码的内容,按照模式匹配的原则第一个方法,是等于重新赋值,而第二个方法由于匹配错误,返回了一个空的列表,!!许多人认为不匹配会返回badmatch!!
通过这个例子你就能更深刻的去理解列表解析的原理!!!‘实际上就是按照匹配规则生成我们所需要的新的列表。
看看下面的代码,元素形式不同的列表的返回情况
8> List2 = [{1},{2,3},{4,5,6}]. [{1},{2,3},{4,5,6}] 9> [X*2||X <- List2]. ** exception error: bad argument in an arithmetic expression in operator */2 called as {1} * 2 10> [X*2||{X} <- List2]. [2] 11> [X*2||{X,Y} <- List2]. [4] 12> [X*2||{X,Y,Z} <- List2]. "\b" 13> [X*2||{X,Y,Z,A} <- List2]. []
为什么这一报错了?
细心的你一定会发现,这次是我们选择了一个于元素类型完全不相符的格式,作为解析元素的单位,编译过程中,这类特殊的字符列入“{}”等,会作为一个分割格式,而单一的数字或大小写字母或词组都会当成atom或者变量或常量来处理,所以元素是以常量嵌套在其他格式中时是不会出现bad argument的错误提示的(这里最好自己做几次试验)
如果你有仔细看第13行的代码,你会发现相同类型确并不存在的元素单位,列表解析式也能进行解析只是返回一个空的列表而已(关于12行输出的结果其实很简单,前面说过在erlang的概念中没有实际意义上的string,string也是一个列表,而''\b''的对应的就是[8],你可以尝试其他的数字列表)
较为复杂列表解析
可以说列表解析方法的运用相当灵活,并不局限于简单的运算
引用一下他人的程序:
-module(test). -export([ qsort/1 ]). -spec qsort(List) -> NewList when List::[AList], NewList::[AList]. qsort([]) ->[]; qsort([Pivot|T]) -> qsort([X||X<-T, X<Pivot]) ++[Pivot]++ qsort([X||X<-T, X>=Pivot]). 输入的是[12,23,25,33,31] 输出的是[12,23,25,31,33]稍有基础的程序猿都能看懂以上代码实现的功能
你也可以自己写几个小程序,当然后面也可以带更多的判断条件。