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]稍有基础的程序猿都能看懂以上代码实现的功能
你也可以自己写几个小程序,当然后面也可以带更多的判断条件。
相关推荐
Erlang是一种并发、分布式、面向进程的编程语言,广泛用于构建高可用性和容错性的系统。在Erlang中,列表是一种基本的数据结构,提供了丰富的操作函数。以下是对标题和描述中提到的Erlang列表函数的详细解释: 1. `...
(setq load-path (append load-path (list distel-dir))))) (require 'distel) (distel-setup) 六、其他配置 在Erlang mode中,还可以进行一些其他的配置,例如设置Erlang shell的节点名、添加Erlang函数到imenu...
- **高效数据结构**:Erlang内置了几种高效的数据类型如原子(Atom)、二进制(Binary)、列表(List)和元组(Tuple)。 - **垃圾收集**:ERTS采用了标记-清除算法,并支持分代垃圾回收策略。 - **软实时系统**:ERTS支持软...
- `iconv_list()`:返回一个列表,包含所有Erlang iconv库支持的字符编码。 4. **使用示例** 假设我们有一个UTF-8编码的字符串,需要转换为GBK编码,可以这样操作: ```erlang {Descriptor, _} = iconv:open(...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和容错系统。本教程将带你入门Erlang,通过实践来学习其基本概念和语法。 在Erlang中,程序是由一系列的进程...
### 效率指南(Erlang) #### 1.1 引言 ##### 1.1.1 目的 本指南旨在帮助Erlang程序员理解如何编写高效、清晰且结构良好的代码。正如Donald E. Knuth所言,“过早优化是一切罪恶之源”,我们强调应该首先关注代码...
Erlang是一种面向并发的编程语言,它采用轻量级进程以及消息传递模型,非常适合于编写并发和分布式系统。Erlang的函数式编程特性以及对模式匹配的支持,为实现KMP算法提供了便利。 在给定的文件内容中,通过Erlang...
13. **erlang**: 基础函数,如`length/1`获取列表长度,`element/2`访问元组元素,`binary_to_list/1`二进制转列表。 14. **binary**: 处理二进制数据的函数,如`bin_to_list/1`和`list_to_bin/1`之间的转换。 ...
(setq load-path (append load-path (list distel-dir))))) (require 'distel) (distel-setup) ``` 6. **启动Emacs**:完成上述配置后,启动Emacs,你就可以享受Erlang的高效开发环境了。 ### Linux下环境搭建 ...
在提供的文件"erlang_list_dict_test.erl"和"erlang_list_dict_test - pro_dict-check_duplicate.erl"中,可以看到Erlang对列表和字典(dict)操作的性能测试。Erlang的字典数据结构通常比其他语言的哈希表更快,...
Erlang的文件操作API(如`file:list_dir/1`、`file:open/2`、`file:read_line/1`和`file:close/1`)是处理文件系统操作的核心部分。它们提供了一种安全且并发友好的方式来访问和操作文件。`filename:join/1,2`函数...
8. 语法和基本概念:Erlang有独特的语法,包括模块(module)、函数(function)、元组(tuple)、列表(list)、记录(record)等数据类型和构造。掌握基本语法是使用Erlang进行开发的基础。 由于文件描述中提到...
10. **社区支持**:在下载和使用过程中遇到问题,可以寻求Erlang社区的帮助,如Stack Overflow、Erlang User Mailing List等,这些平台上有丰富的资源和经验分享。 总之,Erlang虽然在国内下载可能存在不便,但通过...
3. **列表处理(List Comprehensions)**:Erlang提供了强大的列表处理工具,可以用于生成新列表或对列表进行操作。习题可能考察如何使用列表解析进行数据过滤和转换。 4. **模块(Modules)**:Erlang的模块系统有...
- 通过`rabbitmqctl status`命令可以查看RabbitMQ服务器的状态,`list_users`和`list_vhosts`分别用于查看用户和虚拟主机。 5. **使用Java与RabbitMQ交互**: - 如果你使用Java进行开发,可以通过RabbitMQ的Java...
4. **验证RabbitMQ安装**:安装完毕后,打开命令行,输入`rabbitmq-plugins list`来检查RabbitMQ插件是否已安装。另外,可以访问`http://localhost:15672`来查看Web管理界面,初始状态下用户名和密码通常为`guest`/`...
同时,Erlang提供了两种复合数据结构:元组(tuple)和列表(list)。这些数据类型构成了Erlang程序的基础,所有的数据操作都围绕这些类型展开。 2. 模式匹配 模式匹配是Erlang中一个非常重要的特性,它是函数式...
Erlang是一种用于构建并发、分布和容错系统的编程语言和运行时环境。Erlang拥有一个独特的语法和一套内置的数据类型,以及专门为并发编程设计的库。下面将详细介绍Erlang速查表中提到的一些关键知识点。 ### 变量和...