2.基本概念和顺序编程

一. 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条件原语
    ...

你可能感兴趣的:(erlang,基本概念,顺序编程)