一. erlang学习各阶段
1.erlang常用模块:lists、io、file、dict、gen_tcp等
2.makefile自动编译模块
3.erlang扩展库 OTP 特别是gen_server
4.用erlang编写分布式程序
5.Mnesia 数据库
6.与其它语言集成
-------------编程范式--------------
COP(面向并发编程)
二.erlang中的基本概念
1.变量为一次赋值,之后再不会改变,之后的“=”均为模式匹配
2./--浮点除,div--整除,rem--求余
3.元组tuple:一个人的名字和身高描述为元组为 {joe,1.82},为表明其含义可进一步表示为 {person,'joe',1.82}
表示一个人的全面信息,使用嵌套元组为:
Person = {person,
{name,joe},
{height,1.82},
{footsize,42},
{eyecolor,brown}
}.
元组定义: Person = {person,joe,1.82}.
提取名字和身高: {person,Name,Height}= Person. (Name -> joe,Height -> 1.82) 注:等号两边的结构必须相同,才能够匹配并绑定数据
4.列表list:[a1,a2,a3...an]、简写:[H|T],其中H为列表头,可为任意值,T还是列表
5.xx进制数标识为 xx#MyVar 如 8#10 8进制数 10
6.一个变量的Ascii值使用 $X 获得
三.函数定义和模块定义
1. 匿名函数:
例子1:
Z = fun(X) -> 2 * X end.
Double = Z.
匿名函数调用: Double(3). 或者 Z(3).
例子2:
TempCovert = fun({c,C}) -> {f,32 + C*9/5};
({f,F}) -> {c,(F-32)*5/9}
end.
温度转换函数调用:TempCovert({c,100}).
2.以fun(匿名函数)作为参数或作为返回值的函数为erlang的高阶函数.
(1).lists:map(F,L) 该函数将函数fun应用到列表L上
如:list:map(Double,[1,2,3,4,5]).
(2). 列表过滤 lists:filter(F,L) 返回新列表:新列表元素由满足F(E)返回true的元素组成
如:Even = fun(X) -> (X rem 2) =:= 0 end.(此为过滤函数)
lists:filter(Even,[1,2,3,4,5,6,7,8]). 返回:[2,4,6,8]
3.返回fun的高阶函数用法
注:返回fun的高阶函数可以看作是可以生成函数的函数,是一个泛化的函数
如: Fruit = [apple,orange,pear].
MakeTest = fun(L) -> (fun(X) -> lists:member(X,L) end) end. (类似于函数工厂)
IsFruit = MakeTest(Fruit). 函数工厂生产的函数:判断是否为水果的函数
IsFruit(apple) 水果判断
4.for循环实现: 创建一个高阶的for函数
for(Max,Max,F) -> [F(Max)];
for(I,Max,F) -> [F(I) | for(I+1,Max,F)].
for(1,10,fun(X) -> X end). 输出1..10
5.lists:map(F,L) 实现
map(_,[]) -> [];
map(F,[H|T]) -> [F(H)|map(F,T)].
6.列表解析技术
旧方式: 列表元素加倍
L = [1,2,3,4,5].
lists:map( fun(X) -> 2 * X end , L ).
列表解析技术:
[2 * X || X <- L] 含义: [F(X) || X <- L,G(X)] 代表由F(X)组成新的列表,参数X来自列表 L,G(X)函数对列表数据进行过滤
7.列表函数
lists:map(F,L), lists:filter(F,L)
lists:seq(1,N) -- 产生1..N的序列
8.列表运算符
++ 中缀连接操作符 例如: L1 ++ L2 连接列表L1和L2
-- 分离操作符 例如:L1 -- L2 从列表L1中分离出L2得到新列表
9.算数表达式(erlang程序设计中文版57页)
10.断言(guard) 断言是一种强化模式匹配功能的结构,可以在一个模式匹配上做一些变量的简单测试和比较
例如: max(X,Y) when X > Y -> X;
max(X,Y) -> Y.
注:(1). 断言可以用在函数的头部 (2). 断言可以用在任何使用表达式的地方
11.断言序列:
断言序列是多个断言用分号逗号分割的断言集合。
用逗号分割的断言,只有断言序列中的所有断言都成立,断言序列才成立(与断言)
用分号分割的断言,只要断言序列中有一个断言成立,断言序列就成立(或断言)
注:断言谓词和用作断言的BIF(build in function 内建的函数) 见:erlang程序设计中文版58页
12.列表定义: 列表是大元组的替代数据类型(给出了数据的名值对关系)
-record(todo,{status=remind,who=joe,text}). todp---列表的名字,{status..} ---列表的内容定义
在控制台读取record
(1).列表todo定义: -record(todo,{status=remind,who=joe,text}).
rr("records.hrl") rr---read record
记录创建1: X = #todo{}.
记录创建2: X1 = #todo{status=urgent,text="this is a test!"}.
记录创建3: X2 = X1#todo{text="chunying"}. (创建原记录的副本)
从记录中提取记录字段的值: #todo{who=W,text=Txt} = X2.
仅提取特定记录字段的值: X2#todo.text.
(2).列表在函数中的使用 引用有问题: erlang程序设计中文版62页)
(3).记录只是元组的伪装,在erlang系统中只有元组的定义,记录的定义方式只是为了使得元组各元素别名的定义更加简单,
在shell中释放记录的定义命令为 rf(todo)
13.case结构定义:
case表达式语法:
case Expression of
Pattern1 [when Guard1] -> Expr_seq1;
Pattern2 [when Guard2] -> Expr_seq2;
...
end
例子:filter函数定义
filter(P,[H|T]) ->
case P(H) of
true -> [H|filter(P,T)];
false -> filter(P,T)
end;
filter(P,[]) ->
[].
14. if条件原语
...