第二节 模块与函数(下)

简单列表处理

  上一节我们重点介绍了fun,现在我们继续编写sum和map,来改进我们之前实现的total总和的计算.新建一个mylists.erl

1 -module (mylists).
2 -export ([sum/1]).
3
4 sum([H | T])    ->    H + sum(T);
5 sum([])            ->    0.

  然后在shell上执行.

  1> L = [1,3,10].
  [1,3,10]
  2> mylists:sum(L).
  14

  然后我们在原有的lists上增加一个map的方法.

1 -module (mylists).
2 -export ([sum/1,map/2]).
3
4 sum([H | T])    ->    H + sum(T);
5 sum([])            ->    0.
6
7 map(_, [])        ->    [];
8 map(F, [H | T])    ->    [F(H) | map(F, T)].

  运行结果如下:

  1> L = [1,2,3,4,5].
  [1,2,3,4,5]
  2> mylists:map(fun(X) -> 2*X end, L).
  [2,4,6,8,10]
  3> mylists:map(fun(X) -> X*X end, L).
  [1,4,9,16,25]

  现在我们已经了解了sum和map,我们准备用这个来写shop2.erl

1 -module (shop2).
2 -export ([total/1]).
3 -import (lists, [map/2, sum/1]).
4
5 total(L)    ->    sum(map(fun({What, N})    ->    shop:cost(What) * N end, L)).

  运行后结果是:

  1> L = [1,2,3,4,5].
  [1,2,3,4,5]
  2> mylists:map(fun(X) -> 2*X end, L).
  [2,4,6,8,10]
  3> mylists:map(fun(X) -> X*X end, L).
  [1,4,9,16,25]

  -import和-export的用法:

  -import(lists, [map/2,sum/1])声明的意思是map/2函数从lists模块里导入的.

  -export([total/1])声明的意思是total/1函数可以在shop2模块之外调用.只有从一个模块里导出的函数才能在该模块之外调用.

列表推导

  列表推导是无需使用fun,map或filter就能创建列表的表达式.它让程序变得更短,更容易理解.

  以前我们是用lists:map来实现的

  1> L = [1,2,3,4,5].
  [1,2,3,4,5]
  2> lists:map(fun(X) -> 2*X end, L).
  [2,4,6,8,10]

  现在我们看看用列表推导是怎么实现的:

  3> [2*X || X <- L].
  [2,4,6,8,10]

  [ F(X) || X <- L]标记的意思是"由F(X)组成的列表(X从列表L中提取)"

  请注意,||符号右边的X是一个模式,用于匹配列表L里面的各个元素.左侧的2*X则是一个构造器.

  最后我们给shop2.erl改成列表推导的方式

  total(L)  ->

    lists:sum([shop:cost(A)*B||{A,B} <- L]).

  列表推导最常规的形式是这种表达式:[X || Qualifier1, Qualifier2, ...] X是任意一条表达式,后面的限定符可以是生成器,位串生成器或过滤器.

    1.生成器的写法Pattern <- ListExpr,其中的ListExp必须是一个能够得出列表的表达式.

    2.位串生成器的写法是BitStringPattern <= BitStringExpr,其中的BitStringExpr必须是一个能够得出位串的表达式.

    3.过滤器既可以是判断函数,也可以是布尔表达式. [X || {a, X} <- [{a,1},{b,2},{c,3},{a,4},hello,"WoW"]].执行结果就是[1,4]

内置函数

  内置函数简称BIF,是那些作为erlang语言定义一部分的函数.

关卡

  关卡是一种结构,可以用它来增加模式匹配的使用.

时间: 2024-07-28 15:29:48

第二节 模块与函数(下)的相关文章

第二节 模块与函数(上)

模块 模块是erlang的基本代码单元.模块保存在扩展名为.erl的文件里,而且必须先编译才能运行模块里面的代码.编译后的模块以.beam作为扩展名. 我们创建一个geometry.erl的文件 1 -module (geometry). 2 -export ([area/1]). 3 4 area({rectangle,Width,Height}) -> Width * Height; 5 area({square, Side}) -> Side * Side. 然后在shell中编译这个模

萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第二节 线性回归算法 (下)实操篇

线性回归算法 In [ ]: import numpy as np import matplotlib.pyplot as plt from sklearn import datasets In [ ]: boston = datasets.load_boston() X = boston.data[:,5] #- RM average number of rooms per dwelling y = boston.target print(X.shape) print(y.shape) In 

第二十四节,自定义函数

第二十四节,自定义函数函数是将要实现的功能写在函数里,在要使用此功能的地方调用此函数即可实现功能,这样大大减少编程重复书写同样的代码,在多个要使用同样功能的地方调用函数即可不需要重复写同样的代码函数式编程最重要的是增强代码的重用性和可读性 函数的定义主要有如下要点: def:表示函数的关键字函数名:函数的名称,日后根据函数名调用函数函数体:函数中进行一系列的逻辑计算,如:发送邮件.计算出 [11,22,38,888,2]中的最大数等...参数:为函数体提供数据return:返回值:当函数执行完毕

Bash编程语法结构第二节

Bash编程语法结构 一.for结构 其中 $var 是循环控制变量,[list] 是 $var 需要遍历的一个集合, do/done 对包含了循环体,相当于 C 语言中的一对大括号.另外如果 do 和 for 被写在同一行,必须在 do 前面加上 ";".如: for $var in [list]; do .下面是一个运用 for 进行循环的例子: 二.while适用于循环次数未知,或不便用for直接生成较大的列表时: while 测试条件; do 循环体 done 测试条件为真,进

【读书笔记】《鸟哥Linux私房菜-基础知识篇》第二节 基础命令

第二节 基础命令 uname –r 查询Linux核心版本. 装置及装置在Linux内的文件名 IDE硬盘机 /dev/hd[a-d] SCSI/SATA/USB硬盘机 /dev/sd[a-p] USB快闪碟 /dev/sd[a-p] 软盘驱动器 /dev/fd[0-1] 打印机 25针:/dev/lp[0-2] USB:/dev/usb/lp[0-15] 鼠标 USB:/dev/usb/mouse[0-15] PS2:/dev/psaux 当前CDROM/DVDROM /dev/cdrom 当

2014年度辛星css教程夏季版第二节

第一节我们简介了一下CSS的工作流程,我相信读者会有一个大体的认识,那么接下来我们将会深入的研究一下CSS的细节问题,这些问题的涉及将会使我们的工作更加完善. *************注释************ 1.CSS也是需要注释的,注释中的内容不会被解释执行,它也和C语言一样,用/*开头,用*/结尾,其中的内容会被当做注释,我们想怎么写就怎么写. 2.下面给个例子: p{ color: green; /* 我们在这里书写注释 * 辛星CSS,与博客园共同成长 */ font-size:

【软件构造】第三章第二节 设计规约

第三章第二节 软件规约 这一节我们转向关注"方法/函数/操作"是如何定义的,即讨论编程中的动词,规约. Outline 一个完整的方法 什么是设计规约,我们为什么需要他 行为等价性 规约的结构:前置条件与后置条件 规约的结构 可变方法的规约 规约的评价 规约的确定性 规约的陈述性 规约的强度 如何设计一个好的规约 是否使用前置条件 Notes ## 一个完整的方法 一个完整的方法包括规约spec和实现体implementation: "方法"是程序的积木,它可以被独

【软件构造】第五章第二节 设计可复用的软件

第五章第二节  设计可复用的软件 5-1节学习了可复用的层次.形态.表现:本节从类.API.框架三个层面学习如何设计可复用软件实体的具体技术. Outline 设计可复用的类--LSP 行为子结构 Liskov替换原则(LSP) 各种应用中的LSP 数组是协变的 泛型中的LSP 为了解决类型擦除的问题-----Wildcards(通配符) 设计可复用的类--委派与组合 设计可复用库与框架 Notes ## 设计可复用的类--LSP 在OOP之中设计可复用的类 封装和信息隐藏 继承和重写 多态.子

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一、 除夕诗词概述 二、元日诗词概述 三、 元宵诗词概述 第二节:春节古诗词拾萃

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一. 除夕诗词概述 二.元日诗词概述 三. 元宵诗词概述 第二节:春节古诗词拾萃 一.腊祭诗词 二.祭灶诗词 三.除夕诗词 四.元旦诗词 五.人日诗词 六.元宵诗词 第一节:春节古诗词概述 中国的春节,作为除旧迎新的节日,时间相当长,从年前的腊月二十三,天空中就似乎弥漫了节日的气息.这种节日的气氛,在保持传统风俗较好的地方,甚至会持续到二月二龙抬头的时候,但欢度春节的高潮,应该说是自除夕始一直到上元之夜.因此,历代歌咏和反