循环对于list是一个相当重要的操作,下面我们来看一下lists:keyreplace的库函数是怎样完成的
628-spec keyreplace(Key, N, TupleList1, NewTuple) -> TupleList2 when 629 Key :: term(), 630 N :: pos_integer(), 631 TupleList1 :: [Tuple], 632 TupleList2 :: [Tuple], 633 NewTuple :: Tuple, 634 Tuple :: tuple(). 635 636keyreplace(K, N, L, New) when is_integer(N), N > 0, is_tuple(New) -> 637 keyreplace3(K, N, L, New). 638 639keyreplace3(Key, Pos, [Tup|Tail], New) when element(Pos, Tup) == Key -> 640 [New|Tail]; 641keyreplace3(Key, Pos, [H|T], New) -> 642 [H|keyreplace3(Key, Pos, T, New)]; 643keyreplace3(_, _, [], _) -> [].
上面的-spec是说明的意思,讲述每一个参数的格式,
那么当我们格式不相符合的时候会出现什么样的内容我们可以测试一下
Eshell V5.9 (abort with ^G) 1> List = [{1,first},{2,second}]. [{1,first},{2,second}] 2> lists:keyreplace(1,1,List,1). ** exception error: no function clause matching lists:keyreplace(1,1,[{1,first},{2,second}],1) (lists.erl, line 636) 3>
这里显示的是636行,但是相应的代码中636行是第一行我们的逻辑方法,那么我们在来试一试输入错误的List
ถ4> lists:keyreplace(1,1,{1,first},{1}). ** exception error: no function clause matching lists:keyreplace3(1,1,{1,first},{1}) (lists.erl, line 639) 5>
这里我们看到的是639,那么是在list进行匹配的时候出的错误,这也就说明-spec以下的代码只是单纯的为我们介绍了一下这个方法的各个参数和形式,对于程序本身是没有任何影响的
言归正传
当某些库函数无法满足我们的程序的时候,或者我们想要新加一些自己的方法对列表进行处理的时候该怎么做,erlang是没有for这个概念的,但是对于递归方法缺极大的补充了这个遗憾,搭配erlang的匹配模式,那么完成for的这种操作就相当简单了
[H|T] = List这个代码是我们经常能在各类书籍中看到的,很好理解Head,Tail,第一个元素作为头,剩下的元素作为尾那么我们就可以提取出所需要的内容,我们尝试重写lists:foldl(Fun, Acc0, List)方法
先看帮助文档中源foldl实现了什么功能
lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]). 15 > lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]). 120
这个方法循环了列表每一个元素,并设置了一个Acc0的初始变量,对每一个元素进行了处理以后要返回一个新的值,将新的返回值作为下一个元素的初始Acc0传入依次循环最后得到结果(注意这个Acc0可用可不用)
-module(test). -export([ foldl/3 ]). foldl(Fun, Acc0, List) when List =/= [] -> [Head|Tail] = List, NewAcc0 = Fun(Head, Acc0), foldl(Fun, NewAcc0, Tail); foldl(Fun, Accu, []) when is_function(Fun, 2) -> Accu.
我们做一下测试
E:\>erl -make test.erl Recompile: test E:\>erl Eshell V5.9 (abort with ^G) 1> test:foldl(fun(X, Sum) -> X + Sum end,0,[1,2,3]). 6 2>
,结果正确了,那么我们再看一下库函数的代码
foldl(F, Accu, [Hd|Tail]) -> foldl(F, F(Hd, Accu), Tail); foldl(F, Accu, []) when is_function(F, 2) -> Accu.
短短的三行代码,就解决了,而且简洁,代码优化做的真是perfect!!!
那么解决一下这个疑问[Hd|Tail] = []?难道不会匹配吗!测试一下
2> [Head|Tail] = []. ** exception error: no match of right hand side value []
其实结果很明显,即便不用测试也知道,但是心中有疑问测试一下又不用多长时间还能加深印象,何乐而不为呢
2014 3 18补充
when是erlang断言中的一种,算是一种过滤条件,当我们写循环方法时,为了代码的可读性时when是一个不错的选择,case虽然也可以在循环中起到判断作用,但是相对于when无法做到化繁就简
相关推荐
它对`List1`中的每个元素应用`Fun`,返回一个二元组,其中第一个元素是新列表,第二个元素是`Fun`应用过程中的累积值。例如: ```erlang lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end, 0, [1, 2, 3, 4, 5]). ...
3. **列表处理(List Comprehensions)**:Erlang提供了强大的列表处理工具,可以用于生成新列表或对列表进行操作。习题可能考察如何使用列表解析进行数据过滤和转换。 4. **模块(Modules)**:Erlang的模块系统有...
二、安装Emacs W32 Emacs W32是Windows平台下的Emacs版本,提供了功能强大且高度可定制的编辑环境。 readers可以从Emacs W32官方网站下载最新的版本。安装Emacs W32也非常简单,只需要按照安装程序的提示进行操作。...
8. 语法和基本概念:Erlang有独特的语法,包括模块(module)、函数(function)、元组(tuple)、列表(list)、记录(record)等数据类型和构造。掌握基本语法是使用Erlang进行开发的基础。 由于文件描述中提到...
- **高效数据结构**: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所言,“过早优化是一切罪恶之源”,我们强调应该首先关注代码...
13. **erlang**: 基础函数,如`length/1`获取列表长度,`element/2`访问元组元素,`binary_to_list/1`二进制转列表。 14. **binary**: 处理二进制数据的函数,如`bin_to_list/1`和`list_to_bin/1`之间的转换。 ...
Erlang是一种面向并发的编程语言,它采用轻量级进程以及消息传递模型,非常适合于编写并发和分布式系统。Erlang的函数式编程特性以及对模式匹配的支持,为实现KMP算法提供了便利。 在给定的文件内容中,通过Erlang...
(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的字典数据结构通常比其他语言的哈希表更快,...
10. **社区支持**:在下载和使用过程中遇到问题,可以寻求Erlang社区的帮助,如Stack Overflow、Erlang User Mailing List等,这些平台上有丰富的资源和经验分享。 总之,Erlang虽然在国内下载可能存在不便,但通过...
Erlang的文件操作API(如`file:list_dir/1`、`file:open/2`、`file:read_line/1`和`file:close/1`)是处理文件系统操作的核心部分。它们提供了一种安全且并发友好的方式来访问和操作文件。`filename:join/1,2`函数...
- 通过`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标准库提供了丰富的函数来操作二进制数据,如`binary_to_list/1`,`binary_part/3`,`binary:split/2`等。Elixir也通过`Bitwise`模块和`String`模块提供了类似的函数,如`&`操作符进行位操作,`String....
同时,Erlang提供了两种复合数据结构:元组(tuple)和列表(list)。这些数据类型构成了Erlang程序的基础,所有的数据操作都围绕这些类型展开。 2. 模式匹配 模式匹配是Erlang中一个非常重要的特性,它是函数式...