函数式语言:每个表达式都必须有值。
1、Erlang采用不定长的整数来进行整数的算术运算,不用担心运算溢出。
2、所有变量都必须以大写字母开头。
1)单一赋值,
2)模式匹配:=表示一个模式匹配操作 Lhs = Rhs
命令f()会让shell释放它所绑定过的所有变量。
Erlang内存没有可变状态,也就没有共享内存,更没有锁。
3、浮点数必须含有小数点且小数点后至少有一位十进制数。
4、原子:是一串以小写字母开头,后面数字字母或下划线或邮件符号的字符。
使用单引号引起来的字符也是原子。
原子全局有效。
5、元组:(tuple)。将若干个以逗号分割的值用一对花括号括起来,就形成了一个元组。
eg:Person={person, {name, {first, joe}, {last, armstrong}}, {footsize, 42}}.
使用模式匹配提取这个人的姓。
{_, {_, {_, Who}, _}, _} = Person.
Who.
joe
------- _为匿名变量,在同一个范围内可以多次使用。
6、列表:存储数目可变的东西。
列表的第一个元素称为列表的头(head),剩下的称为列表的尾(tail)。
[] 为空列表
[H|T] 使用|将列表的头和尾分隔开来。
7、字符串:严格地讲,Erlang中并没有字符串,字符串实际上就是一个整数列表。用双引号(")将一串字符括起来就是一上字符串。必须使用双引号。
使用$符号来表示字符的整数值。
模块:
-module().
-export(..).
函数:
函数签名:函数名字和参数个数
fun : 匿名函数
函数可以当参数,返回值也可以是函数。
列表解析: ||
[F(X) || X <- L] 代表“由F(X)组成的列表,其中X是取值于列表L“。
eg:
-module(myMath).
-export([qsort/1]).
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X||X <- T, X<Pivot])
++[Pivot]++
qsort([X||X<-T, X>=Pivot]).
毕达哥拉斯三元组:
整数集合{A, B, C},它使得 A平方+B平方=C平方
pythag(N) ->
[{A, B, C} ||
A <- lists:seq(1, N),
B <- lists:seq(1, N),
C <- lists:seq(1, N),
A+B+C =< N,
A*A + B*B =:= C*C
].
变位词:
列出一个字符串所有可能的排列。
perms([]) -> [[]];
perms(L) -> [[H|T] || H<-L, T<-perms(L--[H])].
X--Y是列表的分离操作符,它从列表X中分离出元素Y。
闭包:
The notation [F(X) || X<-L] means "the list of F(X) where X is taken from the list L."
格式:
[X || Qualifier1, Qualifier2, ...]
X is an arbitrary expression, and each qualifier is either a generator or a filter;
Generators are written as Pattern <- ListExpr where ListExpr must be an expression that evaluates to a list terms.
Filter are either predicates (function that return true or false) or boolean expressions.
断言guard:是一种用于强化模式匹配功能的结构。
max(X, Y) when X>Y -> X;
max(X, Y) -> Y.
断言序列: 分号;代表或,逗号(,)代表与
记录record:提供一种把一个名称与元组中的一个元素对应起来的方法。
-record(Name, {
%% the nex two keys have default valuse.
key1 = Default1,
key2 = Default2,
...
%% The next line is equivalent to
%% key3 = undefined
key3,
...
}).
记录只是元组的伪装。
case/if 表达式:
语法:
case Expression of
Pattern1 [when Guard1] -> Expr_seq1;
Pattern2 [when Guard2] -> Expr_seq2;
...
end
if 语法: 在if表达式的这些断言中,至少要有一个结果为true,否则就会抛出一个异常。
if
Guard1 ->
Expr_seq1;
Guard2 ->
Expr_seq2;
...
end
以自然顺序创建列表
--------------------------------erlang中任何东西都是表达式,表达式都有值。