`
pascal4123
  • 浏览: 114654 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Erlang数据结构及流程控制

    博客分类:
  • FP
阅读更多
数据结构反映一个数据的内部构成。

数据的逻辑结构是指成分数据的逻辑关系,可分为单一类型和复合类型。

单一类型
  数值
    整数 - 理论上允许是任意长度(只要不超过机器限制)
    浮点数 64bit
  原子 - 用单引号括起来

复合类型 - 可无限嵌套
  元组 - 不适用于递推

  列表 - 可按序访问(用|),适用于递推
    字符串 - 是一种特殊的列表,用双引号括起来

 
逻辑数据的赋值,由变量绑定实现。
逻辑数据的抽取,由模式匹配实现。

模式匹配中常用到占位变量: _ 和 _Var (区别是后者是实际变量,不能重复定义)

数据的物理结构是指数据在计算机内部的存储形式。
二进制流 - 用<< >>括起来,流不可以进行模式匹配这种复杂操作。

Term - 可以表示任何类型的Erlang数据

tuple_to_list, list_to_tuple只进行复合数据最外层的类型转换,下层嵌套结构不变。

记录record
记录描述了元组的最外层信息,用于批量创建元组。记录可以定义在记录文件中,也可以定义在模块文件中,一个记录文件(.hrl)可以包含多个记录。
-record(myrec,{
    %% the next is structure of record
    k1 = song,
    k2 = feng
    }).
-record(myrec2,{
    %% the next is structure of record
    k1 = song,
    k2 = feng,
    a1 = {china, shanghai, pudong}
    }).

代码中常用-include_lib(File)来包含记录信息

shell中可以用rr(File), rr(File, Rec), rr(File, Rec, Opt)等来读取记录信息

二进制数 形如 <<I1,I2,...>>

list_to_binary(List)
list(必须是一个整数型List!)转成的是一个普通的二进制数据。

term_to_binary(Term)
Term可以是任何的Erlang数据(甚至是二进制数据)
binary_to_term(Bin)
Bin只能是由Term转换成的binary

由Term数据转成的二进制数据,是一种特殊的所谓“外部数据格式”存储的TLV结构(V可无限嵌套TLV')。

Term数据: <<131,T>> <L> (子数据的个数) +
  原子:  <<100,0>> <L> +
  字符串:  <<107,0>> <L> +
  整数: 保持不变
  浮点数: <<99>> + (ASCII码表示,后面补'0')
  元组:<<104>> <L> +
  列表:<<107,0>> <L> +
T可以是 上述子类型任何一种(整数是97)

begin..end 块
end只可用于函数体内

Erlang的模块化是通过模块(.erl)来组织的
运行一个模块,首先要编译它,生成相应的二进制文件(.beam)

匿名函数fun,就是lamba

高阶函数 - 允许传入,使用,或返回匿名函数的函数。

下划线变量 _Var 比 _更具可读性,但注意避免重复定义。

比较表达式:
>   =<  =:=
<   >=  =/=

匿名函数fun的参数可以采用模式匹配
F=
  fun
    (5,Y) -> 10*Y;
    (X,2) -> 3*X;
    (X,Y) -> 3*X + 10*Y  //兜底
  end.

更强的一种做法是用断言guard
when只可出现一次,但其可以使用与(逗号),或(分号)等关系,但不能使用自定义的关系表达式(难以保证其可以正确work)。
F=
  fun (X,Y) when X>3; Y<100, Y>10
    -> X + Y
  end.


函数体内的流程控制可以使用if/case表达式
if
  Bool1 -> Expr1;
  Bool2 -> Expr2;
  true -> Expr3           //兜底
end

case Expr of
  Val1 -> Expr1;
  Val2 -> Expr2;
  _ -> Expr3              //兜底
end

Erlang异常
有三类: exit, error, throw.
exit是发生于系统(二进制代码)内部
error和exit区别不大,脱胎于exit,不同的一点是error会返回栈跟踪,而exit无。往往被用户用来截留exit信号后作些改头换面
throw发生于用户源代码,用于希望编程人员来处理的某类异常

try
  throw({}),
  erlang:error({}),
  exit({})
catch
  throw:X -> {};
  error:X -> {};
  exit:X -> {}
end
分享到:
评论
2 楼 taoshengyijiu20008 2015-06-19  
这里留的空白太多了
1 楼 taoshengyijiu20008 2015-06-19  
真不错啊,最近在学这个

相关推荐

    Erlang程序设计及源码

    Erlang是函数式编程语言的代表之一,它鼓励使用不可变数据结构和纯函数。在Erlang中,函数是第一类公民,可以作为参数传递,也可以作为返回值。函数式编程的特性使Erlang代码更易于理解和调试,因为它们通常没有副...

    erlang 程序设计 源码

    - **数据结构的使用**:Erlang的列表、元组、映射等数据结构在源码中的应用。 - **模式匹配和函数定义**:了解如何通过模式匹配来简化代码,以及函数多态性的实现。 - **OTP库的使用**:观察源码中是如何利用OTP提供...

    Erlang程序设计(第2版)1

    【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...

    erlang趣学指南

    这本书的作者Fred Hébert是一位在一线拥有丰富实战经验的工程师,他通过轻松幽默的文风和清晰的讲解,向读者介绍了Erlang的模块、函数、类型、递归、错误处理、数据结构、并行编程、多处理、事件处理以及Erlang的...

    erlang资源

    1. **Erlang语法**:涵盖基本的变量、数据类型(如原子、列表、元组和二进制)、控制结构(如case表达式和if语句)以及函数定义。 2. **函数式编程概念**:Erlang是纯函数式语言,书中可能会介绍函数式编程的基本...

    erlang深度分析.pdf

    理解分布式协议(dist协议)的格式和全局数据结构(如ETS、Dets)的应用,有助于开发健壮的分布式应用。 #### 6. Erlang的BEAM模拟器 BEAM是Erlang的字节码解释器,模拟器可以用于开发阶段模拟运行和测试Erlang代码...

    Erlang资料大全

    它鼓励使用不可变数据结构和纯函数,这有助于编写无副作用的代码,使得程序更易于理解和测试。同时,Erlang支持模式匹配,这是一种强大的工具,可以在函数定义中匹配和解构复杂的数据结构。 “Erlang中文基础教程”...

    英雄远征erlang源码

    8. **性能优化**:Erlang的性能可以通过合理设计数据结构、减少不必要的计算和通信开销来优化。对于大型游戏,内存管理、数据库查询优化和并发控制都是性能提升的关键点。 9. **版本控制与部署**:开发过程中,版本...

    erlang 深度分析

    - **减少内存消耗**: 通过优化数据结构和算法来降低内存占用。 - **提升响应速度**: 针对瓶颈进行针对性优化,如使用更高效的并发模型。 #### 3. 编码最佳实践 - **模块化**: 将代码组织成多个小而专注的模块,...

    erlang_gproc_扩展实现Erlang的全局ets

    - **灵活的数据结构**:`gproc`不仅支持简单的键值对,还支持列表、树形结构等复杂数据组织方式。 2. **gproc与ETS的结合** - **全局ETS表**:`gproc`扩展了ETS的功能,创建了全局可见的ETS表,这些表可以被整个...

    Concurrent Programming in ERLANG (P1-90)

    Erlang提供了丰富的内置函数,这些函数覆盖了从简单的数值计算到复杂的数据结构操作的各种功能。掌握这些内置函数对于高效地编写Erlang程序至关重要。 **1.5 并发** 并发是Erlang最引人注目的特性之一。Erlang的...

    erlang ranch实现的游戏tcp服务器

    设计合理的数据结构和消息处理机制是提升服务器性能的关键。 5. **并发处理**:Erlang的轻量级进程使得并发处理变得简单。理解如何使用进程来处理每个客户端连接,以及如何通过消息传递进行进程间的通信。 6. **...

    Pragmatic.Programming.Erlang.2nd.Edition

    1. **核心语言和框架基础:**第二版涵盖了Erlang的核心概念和技术细节,包括语法、数据类型、流程控制、函数式编程等基础知识。 2. **社区项目介绍:**书中还详细介绍了Erlang社区中重要的开源项目,如构建工具rebar...

    某流水过千W的erlang游戏后端

    5. **高效的数据结构**:Erlang的列表、二元组和散列表等数据结构提供了高效的操作,便于快速处理游戏中的各种数据,如玩家信息、游戏状态等。 6. **OTP(Open Telecom Platform)框架**:OTP提供了一套标准库和...

    erlang 中文,chm参考文档

    4. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,用于在函数定义中解构复杂的数据结构。 5. **错误处理**:讲解Erlang的异常处理机制,如try-catch-finally语句。 6. **模式和类型**:涵盖模式匹配和类型...

    erlang open poker 最好的入门程序源码

    6. **数据结构与模式匹配**:Erlang的元组(tuple)、列表(list)和二进制数据(binary)等数据结构在源码中会得到广泛运用。模式匹配用于解构数据和条件分支,使得代码更简洁。 7. **网络编程**:OpenPoker作为...

    Erlang程序设计.pdf

    - **模式匹配**:模式匹配是Erlang的一个重要特性,它允许开发者以一种声明性的方式来处理数据结构,例如在函数定义中使用模式匹配来提取数据。 #### 2. 进程与消息传递 - **进程创建**:在Erlang中,可以通过`...

    erlang两种参数模块化

    参数化模块的引入不仅可以帮助开发者避免常见的错误,如通过函数闭包引入的意外闭包状态,而且有助于开发者以更清晰和结构化的方式构建Erlang应用程序。通过这种扩展,Erlang继续保持了其作为构建大型并发和分布式...

    Erlang安装手册

    函数式编程的特点包括无副作用、纯函数以及不可变的数据结构等。 ##### 11. 动态类型 Erlang采用动态类型系统,变量的类型在运行时确定。这种灵活性使得开发人员可以快速编写和测试代码,但同时也需要程序员确保...

Global site tag (gtag.js) - Google Analytics