《Erlang程序设计》学习笔记-第3章 顺序型编程

摘自:http://hi.baidu.com/zai215837829/blog/item/2f4fc2c770c882019d163d80.html

1. 自定义的for循环结构:
    for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I) | for(I+1, Max)].


2. -import(lists, [map/2, sum/1]. 导入lists模块中的map/2和sum/1函数,这样再应用时可以直接写map(...)和sum(...)了。

3. 列表解析: [F(X) || X <- L]。例子:
[ 2*X || X <- L] %% 将列表L的元素*2,生成新的列表。
[{Name, 2*Number} || {Name, Number} <- Buy]
[shop:cost(A)*B || {A, B} <- Buy]
map(F, L) -> [F(X) || X <- L].

4. 列表解析的常见形式:[X || Qualifier1, Qualifier2, ...]
X是一个任意的表达式,每一个限定词可以是一个生成器,也可以是一个过滤器。
生成器: Pattern <- ListExpr, ListExpr必须是一个对列表项求值的表达式。
过滤器: 可以是一个返回true或false的函数,也可以是一个布尔表达式。
其实,生成器的Pattern也可以起到过滤器的作用,如:
[X || {a, X} <- [{a, 1}, {b, 2}, {c, 3}, {a, 4}, hello, "wow"]]. %% 返回值:[1,4]
相当于[X || {A, X} <- [{a, 1}, {b, 2}, {c, 3}, {a, 4}, hello, "wow"], A=:=a].
map18. A++B,是将列表B附加到列表A上生成一个新的列表,但效率不高。
A--B,是从列表A中删除与B中元素相同的所有元素,如果元素X在B中出现K次,则会从A中依次删除K个元素X。

5. 断言(guard)是一种用于强化模式匹配功能的结构。


6. 在函数定义的头部使用断言时,必须以关键字when开头。如:
    max(X, Y) when X > Y -> X;
man(X, Y) -> Y.


7. 可以在任何允许使用表达式的地方使用断言,当断言用于表达式时,它要么返回原子true(认为是求值成功),要么返回原子false(求值失败)。


8. 断言序列:
一组用逗号分隔的断言表达式表示的是and关系,即所以的断言为true,整个断言序列才为true。
一组用分号分隔的断言表达式表示的是or关系

9. 断言谓词:
is_atom(X)
is_binary(X)
is_constant(X)
is_float(X)
is_function(X)
is_function(X, N)
is_integer(X)
is_list(X)
is_number(X)
is_pid(X)
is_port(X)
is_reference(X)
is_tuple(X)
is_record(X, Tag)
is_record(X, Tag, N)

10. 断言BIF
abs(X) X的绝对值
element(N, X) 元组X的第N个元素
float(X) 将数字N转换为浮点数
hd(X) 列表X的头部
length(X) 列表X的长度
node() 当前节点
node(X) 进程X的节点
round(X) 将数字X转换为整数(四舍五入)
self() 当前进程的标识符
size(X) X的大小,X为元组或二进制数据
trunc(X) 将数字X转换为整数(截取)
tl(X) 列表X的尾部

11. 尽量在一个列表的头部进行操作,尽量避免用到List++[H]这样的代码,除非List很短。通常要以自然顺序创建列表。规则如下:
(1)总是在列表头部添加元素。
(2)从一个输入列表的头部提取元素,然后把它们加在一个输出列表的头部。输出列表中的结果与输入列表的顺序相反。
(3)如果顺序至关重要,那么调用经过高度优化的函数list:reverse/1。 (这个函数是在erlang虚拟机中实现的,经过了高度的优化)。
(4)避免违反这些原则。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值