`
做一行爱一行吧
  • 浏览: 23812 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang的list(二)

 
阅读更多

循环对于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无法做到化繁就简

 

 

 

 

 

分享到:
评论

相关推荐

    Erlang list用法

    它对`List1`中的每个元素应用`Fun`,返回一个二元组,其中第一个元素是新列表,第二个元素是`Fun`应用过程中的累积值。例如: ```erlang lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end, 0, [1, 2, 3, 4, 5]). ...

    erlang程序设计第二版课后习题答案(精简版).zip

    3. **列表处理(List Comprehensions)**:Erlang提供了强大的列表处理工具,可以用于生成新列表或对列表进行操作。习题可能考察如何使用列表解析进行数据过滤和转换。 4. **模块(Modules)**:Erlang的模块系统有...

    Erlang开发环境搭建

    二、安装Emacs W32 Emacs W32是Windows平台下的Emacs版本,提供了功能强大且高度可定制的编辑环境。 readers可以从Emacs W32官方网站下载最新的版本。安装Emacs W32也非常简单,只需要按照安装程序的提示进行操作。...

    Erlang程序设计中文版(完整书签).pdf

    8. 语法和基本概念:Erlang有独特的语法,包括模块(module)、函数(function)、元组(tuple)、列表(list)、记录(record)等数据类型和构造。掌握基本语法是使用Erlang进行开发的基础。 由于文件描述中提到...

    inside Erlang VM3

    - **高效数据结构**:Erlang内置了几种高效的数据类型如原子(Atom)、二进制(Binary)、列表(List)和元组(Tuple)。 - **垃圾收集**:ERTS采用了标记-清除算法,并支持分代垃圾回收策略。 - **软实时系统**:ERTS支持软...

    erlang lib of iconv

    - `iconv_list()`:返回一个列表,包含所有Erlang iconv库支持的字符编码。 4. **使用示例** 假设我们有一个UTF-8编码的字符串,需要转换为GBK编码,可以这样操作: ```erlang {Descriptor, _} = iconv:open(...

    erlang 入门练习

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和容错系统。本教程将带你入门Erlang,通过实践来学习其基本概念和语法。 在Erlang中,程序是由一系列的进程...

    Efficiency Guide (erlang)

    ### 效率指南(Erlang) #### 1.1 引言 ##### 1.1.1 目的 本指南旨在帮助Erlang程序员理解如何编写高效、清晰且结构良好的代码。正如Donald E. Knuth所言,“过早优化是一切罪恶之源”,我们强调应该首先关注代码...

    erlang r17官方api及stdlib手册

    13. **erlang**: 基础函数,如`length/1`获取列表长度,`element/2`访问元组元素,`binary_to_list/1`二进制转列表。 14. **binary**: 处理二进制数据的函数,如`bin_to_list/1`和`list_to_bin/1`之间的转换。 ...

    KMP(Erlang)代码实现

    Erlang是一种面向并发的编程语言,它采用轻量级进程以及消息传递模型,非常适合于编写并发和分布式系统。Erlang的函数式编程特性以及对模式匹配的支持,为实现KMP算法提供了便利。 在给定的文件内容中,通过Erlang...

    erlang环境搭建

    (setq load-path (append load-path (list distel-dir))))) (require 'distel) (distel-setup) ``` 6. **启动Emacs**:完成上述配置后,启动Emacs,你就可以享受Erlang的高效开发环境了。 ### Linux下环境搭建 ...

    java php python erlang 千万级内存数据性能比较

    在提供的文件"erlang_list_dict_test.erl"和"erlang_list_dict_test - pro_dict-check_duplicate.erl"中,可以看到Erlang对列表和字典(dict)操作的性能测试。Erlang的字典数据结构通常比其他语言的哈希表更快,...

    Erlang国内下载真难

    10. **社区支持**:在下载和使用过程中遇到问题,可以寻求Erlang社区的帮助,如Stack Overflow、Erlang User Mailing List等,这些平台上有丰富的资源和经验分享。 总之,Erlang虽然在国内下载可能存在不便,但通过...

    for_each_file 用erlang代码实现遍历文件

    Erlang的文件操作API(如`file:list_dir/1`、`file:open/2`、`file:read_line/1`和`file:close/1`)是处理文件系统操作的核心部分。它们提供了一种安全且并发友好的方式来访问和操作文件。`filename:join/1,2`函数...

    RabbitMq3.85与erlang23的安装包.zip

    4. **验证RabbitMQ安装**:安装完毕后,打开命令行,输入`rabbitmq-plugins list`来检查RabbitMQ插件是否已安装。另外,可以访问`http://localhost:15672`来查看Web管理界面,初始状态下用户名和密码通常为`guest`/`...

    windows Erlang otp_win64_22.3+rabbitmq-server-3.8.3.rar

    - 通过`rabbitmqctl status`命令可以查看RabbitMQ服务器的状态,`list_users`和`list_vhosts`分别用于查看用户和虚拟主机。 5. **使用Java与RabbitMQ交互**: - 如果你使用Java进行开发,可以通过RabbitMQ的Java...

    binpp::1234:Erlang二进制漂亮打印机

    Erlang标准库提供了丰富的函数来操作二进制数据,如`binary_to_list/1`,`binary_part/3`,`binary:split/2`等。Elixir也通过`Bitwise`模块和`String`模块提供了类似的函数,如`&`操作符进行位操作,`String....

    erlang api 最新资源

    同时,Erlang提供了两种复合数据结构:元组(tuple)和列表(list)。这些数据类型构成了Erlang程序的基础,所有的数据操作都围绕这些类型展开。 2. 模式匹配 模式匹配是Erlang中一个非常重要的特性,它是函数式...

Global site tag (gtag.js) - Google Analytics