1、模块
模块是Erlang中代码的基本单元,我们编写的所有函数都存于模块之中。模块文件存放在以.erl为扩展名的文件中。模块名字与文件名需一致,运行前先得把文件编译成.beam文件。简单模块文件如下:
geometry.erl
-module(geometry).
-export([area/1]).
area({rectangle,Width,Ht}) ->Width * Ht;
area({circle,R}) -> 3.14159 * R * R.
2、Erlang console切换目录
cd("c:/work")进行切换目录
3、fun
fun就是匿名函数。
Z = fun(X) ->2*X end.
Z(2).
4、以fun为参数的函数
list是标准库中的一个模块,从中导出很函数都是以fun作为参数的。
lists:map(F,L) ---将函数应用到列表L的每一个元素上,并返回一个新列表。
lists:filter(P,L)----返回一个新列表,新列表由列表L中每一个能满足P(E)为true的元素组成。
5、返回fun的函数
Fruit = [apple,pear,orange].
MakeTest = fun(L)->(fun(X) -> lists:member(X,L) end) end.
IsFruit = MakeTest(Fruit).
IsFruit(pear).
其中:
lists:member(X,L)--如果X是列表L的成员,则函数lists:member(X,L)返回true.
6、定义自己的抽象流程控制
Erlang普通版 FOR 循环
fact(N) when N <=0 -> 1;
fact(N) when N > 0 -> N * fact(N-1).
Erlang尾部递归版FOR循环
fact0(N, R) when N <=0 -> R;
fact0(N, R) when N > 0 -> fact0(N-1, N*R).
fact(N) -> facto(N,1).
尾递归版本避免了栈内存消耗, 普通版为N*占用很多内存
7、列表解析
记号[F(X) || X <- l]代表“由F(X)组成的列表,其中X是取值于列表L”。
[2*X || X <- L). 意味着“列表L中每一个元素X乘以2后的列表”。
8、Case/if表达式
case Expression of
Pattern1 [when Guard1] -> Expr_seq1;
Pattern2 [when Guard2] -> Expr_seq2;
...
end
求值后,依次对Pattern进行匹配(带Guard).如果没有任何匹配则报错。
if
Guard1 -> Expr_seq1;
Guard2 -> Expr_seq2;
...
end