erlang相关书籍网盘分享下载:https://blog.csdn.net/weixin_40352578/article/details/82944159
1.模块
在erlang模块中,通过函数名和模式匹配匹配不同的子句。进入一个函数的时候,调用是按照模式在文件中的顺序依次进行匹配的,如果模式匹配失败,返回一条错误消息(function_clause表示没有可匹配的子句)。
拓展:
逗号用来哥哥函数调用,数据构造器,以及模式中的参数。
句号用来在shell中分割完整的函数和表达式。
句号用来分隔子句。子句使用在:分段的函数定义,case语句,if语句,try......catch语句以及receive表达式。
2.fun
匿名函数,高级函数。可以使用模式匹配和高阶函数实现if,switch,for,while等语句。
拓展:高阶函数
这些能够返回fan和接受fun作为参数的函数被称为高阶函数。
以fun为参数的函数:
返回fun的函数:提供一个函数的泛化版本,不能访问匿名函数内部的变量,注意与闭包区分开来。
3.列表解析
列表解析式可以无需使用fun,map或filter来创建表达式,简化程序,利于理解。
等效于
列表L中每一个元素X乘以2后的列表。使用"|"右边的元素对每个元素进行模式匹配,筛选出否和条件的项,左边是构造器。
列表解析的常见形式:
其中qulifier可以是生成器或者是一个过滤器。
生成器:Pattern<-ListExpr,listExpr必须是一个对列表项求值的表达式(可以使用模式匹配充当过滤器的工作)。
过滤器:返回true或false的函数,或者一个布尔表达式。
4.断言
可以在函数定义的头部使用断言。
断言用于表达式时候,会求值为一个原子true或false。
使用逗号隔开的断言集合,只有所有的断言为true,整个为true;使用分号隔开的断言集合,任何一个为true全部为true。
注意:
短路表达式:Expr1 orelse Expr2,首先对Expr1求值为true,Expr2短路不求值。如果Expr1为false对Expr2求值。
Expr1 andalso Expr2:Expr1为true,Expr2求值,若为false,Expr2不求值。
区分(A or B;A and B),表达式真实值可以第一个参数求出,但是两个参数都需要求值。
true原子断言:
在if的尾部使用。
5.记录
记录提供一种名称与元组中的一个元素相对应起来,解决元组没有名字的问题。
其中Name为记录名,key1等是记录中的字段名字,名字必须为原子。
创建记录:#todo{key1=Val1,...,keyN=ValN },用于创建类型为todo的新纪录,key都是原子,省略使用默认值。可以使用X1#todo{status=done}创建X1的副本。
从记录中提取字段值:使用记录模式匹配和“点语法”获取。
在函数中对记录进行模式匹配:
释放记录:通过rf()操作释放记录到元组。
6.case/if表达式
(1)case表达式
对Expression进行求值,将结果对Pattern进行模式匹配(或者进行断言操作),并返回case操作的结果。可以将变量_放在最下面的条件层,用来处理没有匹配条件时执行的操作。
(2)if表达式
依次进行断言操作,在if结构中最后一个通常为原子true用于匹配都不满足时应该执行的操作,否则会抛出异常。
7.通过尾递归创建列表
8.累加器
遍历列表一次,尾递归,节省空间。