erlang顺序编程初步

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.累加器

遍历列表一次,尾递归,节省空间。

猜你喜欢

转载自blog.csdn.net/weixin_40352578/article/details/79473686