1、模块
1>、模块是Erlang中的基本单元,我们写的所有函数都存于模块之中。模块文件常放于 .erl 文件中。
2>、模块编译成功,为 .beam 文件。
3>、函数的子句间用分号( ;)分隔,最后一条子句以句点( . )作为结束符。 注:每一个子句都有一个函数头 和 一个函数体。!!!
函数头由函数名和随后以括号括起来的模式组成。
函数体则由一系列表达式组成。(若模式 与 调用参数匹配成功,则执行对应表达式)。
4>、模式匹配:从上往下执行代码
函数不能处理模式匹配失败的情形,此时要用
try E
catch Eer
end.
结构来控制异常的输出,然后使用 case/if 来处理异常。
5>、在 -export ([ Name / N ]) 中,表示一个带有 N 个参数的 名为 Name 的函数。N 称为函数的运算目。
6>、逗号( ,)用来分隔函数调用、数据构造器、模式中的参数。
句号( . )用来分隔完整的函数、完整的表达式。
分号( ;)用来分隔子句。在 分段的函数定义 、 case语句 、 if语句 、 try...catch语句 、 receive表达式 中会使用分号。
7>、[ X ] 就是 [ X | [ ] ] 的缩写。
8>、函数的目,就是它所拥有的参数数量。
9>、在Erlang中,同一个模块的两个 函数,若同名但不同目,那这是两个完全不同的函数,只是名字恰巧一样。(可作为辅助函数,让代码易懂)
2、fun函数
1>、高阶函数(匿名函数) 称为fun() 可以用它创建自己的控制抽象。
fun()函数被称为匿名函数,是因为它没有名字。
2>、fun()函数可以拥有任意数量的参数。
格式: 1)、Name(变量) = fun(参数) -> 表达式 end.
这个错误被称为 badarity?
badarity表明在Erlang中找不到由所调用的函数名及其给定的参数数量所表明的函数。
3>、除极个别情况外, fun既可以作为函数的参数,也可以作为函数 ( 或者 fun ) 的结果。
这些能够返回 fun 或者接受 fun 作为参数的函数,都被称为高阶函数。 高阶函数是函数式语言的灵魂所在,它能使程序脱胎换骨。!!
3、以fun 为参数的函数
list是标准库中的一个模块,从中导出的很多函数都是以 fun 作为参数的。
对列表进行批量操作的方法。
1>、lists:map(F,L).
这个函数将 fun F 应用到列表 L 的每一个元素上,并返回一个新的列表。
2>、lists:filter(P,L).
它返回一个新列表,新列表由列表 L 中每一个能满足 P(E) 为 true 的元素组成。
4、返回 fun 的函数
1>、lists:member(X,L).
如果 X 是列表 L 的成员,那么这个函数返回 true ,反之返回 false 。
eg:MakeTest = fun(L) -> (fun(X) -> lists:member(X,L) end) end.
IsFruit(X) = MakeTest(Fruit).
等效于:
IsFruit = fun(X) -> lists:member(X,IsFruit) end.
apple =:= lists:member(apple,L).
2>、在使用高阶函数时,可以创建自己的新的抽象控制结构。可以将函数作为函数的参数传入,可以编写返回 fun 的函数。
3>、返回 fun 的函数通常都不容易调试,但这种技术可以解决 如:延迟求值、可重入的解析器、解析组合子 等问题。 因为这些问题本身就是返回解析器的函数。
4>、for循环
for(Max, Max, F) -> [F(Max)];
For(I, Max, F) ->[F(I) | for(I+1, Max, F)].
5>、有时创建自己的控制结构可以很大地降低程序的代码量,有时它还能让程序变得更为清晰。
5、有 fun 函数,进行简单的列表处理
eg:mylists:map(fun(X)->X*X end,L).
这里将 (fun(X)->X*X end 的结构(结果)作为参数。
6、-import() 、 -export() 声明。
7、列表解析技术
8、生成器、过滤器
9、算术表达式
10、断言
max(X, Y) when X > Y -> X;
max(X, Y) -> Y.
11、断言序列
1>、可以是单个断言也可以是一系列用( ;)分号分开的断言集合。
2>、断言也可以是一系列用( ,)逗号分开的断言集合。
3>、合法的断言表达式只是合法 Erlang 表达式的子集,所以要求没有副作用!
12、记录 record
1>、记录提供了一种方法把一个名称与元组中的一个元素对应起来。
如:-record(Name,{key1,Value1},{key2,Value2}). key必须是原子。
2>、记录只是原来的一个副本,原有记录本身并未改变。
3>、如果仅想提取记录之中某个字段的值,那么我们可以使用 ”点语法“ 来获取:
eg: 8> X#todo.text.
"Fix errata in book"
4>、记录是元组的伪装
13、case / if 表达式
1>、case
2>、if 在 if 表达式中,至少要有一个结果为 true ,否则就会抛出一个异常。
14、以自然顺序创建列表的四大原则
反转一个列表以后要调用函数 lists:reverse().