`
jjchen_lian
  • 浏览: 86388 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

erlang模式匹配小记录

阅读更多

初学erlang,这里对erlang的模式匹配进行记录一下,当然下面是我从各个不同的网站摘取的一些值得注意的地方,主要方便自己以后的查阅。下面总结了几点需要注意的地方:
1:模式匹配为变量赋值提供了基本的机制。被赋值后,变量便被绑定——否则便是未绑定变量。给变量赋值的动作称作“绑定”。变量一旦被绑定便不可更改。这种变量属性被称为一次性绑定或单次赋值。这种属性与传统命令式语言的破坏性赋值[2]相反。这一点区别其他编程语言;
2:如果一个模式与一个项式在结构上同构,且在模式中任一位置出现的原子数据类型也都在项式的相应位置上出现,则称他们它们相互匹配;
3:如果模式中包含未绑定变量,则该变量在匹配过程中将被绑定到项式中相应的元素。如果在模式中相同的变量多次出现,则项式中对应位置的元素也必须相同;
{Element, Element, _} = {1,1,2}. 
{1,1,2}
如果是{Element, Element, _} = {1,2,2}.  这样子就会报错
4:模式匹配[A,B,C,D] = [1,2,3]则会失败。虽然它们两个都是列表类型,但是左边的列表有4个元素,而右边一个列表只有3个元素。一个常见的误解是D可以设置为空列表,然后模式匹配应该成功。在这个例子中这是不可能的,因为C和D之间由逗号而不是构造器操作符分隔开。[A,B,C|D]=[1,2,3]的模式匹配就会成功,变量A、B和C分别绑定到整数1、2和3,变量D则绑定到尾部,在这里就是空列表。如果我们尝试[A,B|C]=[1,2,3,4,5,6,7],A和B将分别绑定到1和2,而C则会绑定到一个包含[3,4,5,6,7]的列表;
5:最后一个例子,[H|T]=[]会失败,因为[H|T]意味着这个列表至少要有一个元素,而我们右边其实是一个空列表;
6:变量可以用下划线开始,下划线是一个特殊的标记,它告诉编译器,这些变量是无关紧要的,它们只是作为程序中不需要的变量的占位符。“无关紧要的”变量的功能跟普通变量一样,可以检查、使用和比较它们的值。唯一不同的是,普通变量的值如果从未使用过,编译器将会发出警告,而使用“无关紧要的”变量则不会。使用“无关紧要的”变量是一种很好的编程实践,这告诉阅读代码的人应该忽略掉这个值。为了提高可读性和维护性,程序员经常以“无关紧要的”变量的形式引入值和类型。下划线本身也是个“无关紧要的”变量,但不能访问其内容:因为它的值被忽略了而且从未绑定。
当模式匹配的时候,请注意“无关紧要的”变量的使用,让我们来看下面的具体例子:
{A, _, [B|_], {B}} = {abc, 23, [22, 23], {22}}
由于_变量从不绑定,因此它的值匹配不匹配都是无关的。但是,如果我们这么写:
{A, _int, [B|_int], {B}} = {abc, 23, [22, 23], {22}}
这就彻底改变了程序的语义。该变量_int先绑定到整数23,随后和一个包含整数23的列表相比较。这将导致这个模式匹配失败。
****当然你有可能想问为什么这样不行。这要考虑到erlang的特性,_int = 23,这样_int就被绑定了数据23,而[B|_int] = [22,23],这样B = 22,但是_int = [23],这是_int是列表了,所以不行。


下面给出一个模式匹配的例子:

-module(mySet).
-export([new/0,add_element/2,del_element/2,is_element/2,is_empty/1,union/2,intersection/2]).

new() ->
    [].
add_element(X,Set) ->
    case is_element(X,Set) of
    true ->
        Set;
    false ->
        [X | Set]
    end.

is_element(X,[X | _]) ->
    true;
is_element(X,[_ | T]) ->
    is_element(X,T);
is_element(_,[]) ->
    false.

del_element(X,[X | Set]) ->
    Set;
del_element(X,[_ | Set]) ->
    del_element(X,Set);
del_element(_,[]) ->
    [].

is_empty([]) ->
    true;
is_empty(_) ->
    false.

union([H | T],Set) ->
    union(T,add_element(H,Set));
union([],Set) ->
    Set.

intersection(S1,S2) ->
    intersection(S1,S2,[]).
intersection([],_,S3) ->
    S3;
intersection([X|H],S2,S3) ->
    case is_element(X,S2) of
    true ->
        intersection(H,S2,[X|S3]);
    false ->
        intersection(H,S2,S3)
    end.

 

分享到:
评论

相关推荐

    Match在JavaScript中实现类似于Erlang的模式匹配

    Erlang中的模式匹配允许开发者在函数调用中解构数据结构,如列表和记录,以便于数据操作。在JavaScript中,虽然没有内置的模式匹配功能,但我们可以利用正则表达式和对象解构等特性来模拟Erlang的模式匹配行为。 ...

    erlang 程序设计 源码

    4. **模式匹配**:Erlang的模式匹配允许在函数调用中解构复杂的数据结构,方便地提取所需信息,同时也用于case语句和收到的消息匹配。 5. **BEAM虚拟机**:Erlang运行在BEAM虚拟机上,BEAM提供了高效的内存管理、...

    一种傻纸牌游戏的Erlang实现

    - **模式匹配**:Erlang的模式匹配允许在函数调用时解构复杂的数据结构,简化游戏规则的实现。 2. **游戏模块分析**: - **game.erl**:这是游戏的主要逻辑模块,可能包含游戏的初始化、玩家操作、游戏规则以及...

    KMP(Erlang)代码实现

    Erlang的函数式编程特性以及对模式匹配的支持,为实现KMP算法提供了便利。 在给定的文件内容中,通过Erlang语言实现了KMP算法,以下是从文件内容中提取的关键知识点: 1. kmp_search/2函数:这是KMP算法的主函数,...

    erlang深度分析

    4. **模式匹配**:Erlang的模式匹配功能在函数调用和case语句中广泛应用,使得代码更简洁,更易于理解。 5. **并发编程**:Erlang的并发模型基于actor模型,每个actor(进程)独立执行任务,通过消息传递进行通信,...

    erlang 设计指南

    **Erlang设计指南** Erlang是一种面向并发的、函数式编程...通过阅读"Pragmatic Programming Erlang",你可以掌握Erlang的关键概念,如进程、消息传递、模式匹配、OTP和分布式系统设计,从而提升你的并发编程技能。

    Erlang程序设计及源代码打包

    - 数据结构和模式匹配应用:例如如何使用Erlang的列表、元组和记录,以及如何利用模式匹配进行数据操作。 - 分布式系统构建:如节点间的交互,分布式进程管理和监控,以及如何构建容错的分布式应用程序。 **学习...

    ERLang+RabbitMQ安装包

    3. **模式匹配**:Erlang的函数调用支持模式匹配,这使得代码更加简洁且易于理解。 4. **BEAM虚拟机**:Erlang运行在BEAM虚拟机上,该虚拟机优化了并发执行和内存管理,适合实时系统。 5. ** OTP(Open Telecom ...

    erlang tcp_server

    Erlang的模式匹配和字符串处理功能在这里非常有用。 10. **安全性**:在实际应用中,还需要考虑TCP服务器的安全措施,如SSL/TLS加密,防止DOS攻击,以及对客户端身份的验证。 了解并掌握这些知识点后,你就可以...

    erlang程序设计

    10. Pattern Matching:Erlang的模式匹配是其语法的一大特色,允许在函数定义时检查和提取参数的结构。 11. Recursion:由于Erlang的函数式特性,递归是解决问题的常见手段,特别是在处理列表和其他集合数据时。 ...

    Erlang中文手册

    Erlang是函数式编程语言,其语法简洁,支持高阶函数和模式匹配。函数式编程鼓励通过纯函数来编写代码,避免了副作用,简化了调试和测试。 **OTP(Open Telecom Platform)** OTP是Erlang的标准库,包含了一系列...

    Erlang保留字

    - **模式匹配**:Erlang中的异常可以通过模式匹配来捕获和处理,如`{'EXIT', Pid, Why}`可以捕获进程终止的异常。 - **通配符`_`**:可以用来忽略某些异常或匹配任何异常。 #### 五、函数引用与数值表示 - **函数...

    erlang聊天室源码

    Erlang的原子化操作和模式匹配特性使得处理这些任务变得简洁高效。 2. **消息处理模块**:接收用户输入,可能包含消息的编码、解码,以及存储和转发消息到目标用户。Erlang的OTP(Open Telecom Platform)库提供了...

    erlang 聊天室源码

    首先,我们要理解Erlang的核心特性,这包括轻量级进程(process)、模式匹配(pattern matching)以及它的错误处理机制。Erlang的进程独立且互相隔离,这使得它能轻松处理大量并发连接,非常适合聊天室这样的实时...

    Concurrent Programming in ERLANG (P1-90)

    模式匹配是Erlang的一个核心特性,它允许开发者以直观的方式处理数据。通过模式匹配,可以轻松地从复合数据结构中提取信息或进行条件判断。例如,在函数定义中使用模式匹配来根据输入参数的不同执行不同的逻辑。 **...

    英雄远征erlang源码

    这些模块通常以函数的形式编写,通过Erlang的模式匹配和函数式特性,实现清晰且可维护的代码结构。 6. **状态管理和数据同步**:在多玩家在线游戏中,服务器需要维护玩家的状态,例如位置、生命值等,并在多个玩家...

    erlang otp 19.1 官网文档 HTML格式

    它包括Erlang虚拟机(BEAM)、进程间通信机制、错误处理工具以及一系列预先设计好的行为模式(Behaviours),如GenServer、GenEvent和Supervisor,这些模式提供了强大的容错和恢复能力。 **2. ERTS - Erlang Run-...

    Erlang 速查表 v1.0.pdf

    以上是Erlang速查表中提到的关键知识点的详细说明,涵盖了变量、字符串、列表、元组、函数、宏、Erlang Shell、记录、列表操作、模块属性、表达式、模式匹配以及编译选项等概念。通过这些知识点,我们可以看到Erlang...

    Erlang程序设计中文版(完整书签).pdf

    你还将学习Erlang的模式匹配,这是一种强大的语法特性,用于解构数据结构并根据模式执行不同操作。 Erlang的 OTP(Open Telecom Platform)框架是其广泛应用的关键,它包括一系列的设计原则、库和工具,如分布式...

Global site tag (gtag.js) - Google Analytics