Erlang函数与模式匹配(2)

来源:互联网 发布:keil c51软件 编辑:程序博客网 时间:2024/05/21 17:46

    在《Erlang函数与模式匹配》中介绍了函数的定义方法与模式匹配在函数定义中的基本应用,本节继续深入这个主题。

    一、元组在函数参数中的模式匹配

    如果你需要定义一个将厘米转换为米的函数,最简单的就是:

    convert(X) ->        X / 100.
    可是,如果用户输入了长度单位是分米的话,函数无法分辨,结果一定是悲剧。为了不发生悲剧,我可以这样定义:
    convert({cm,X}) ->        X / 100.
    当为此函数传入参数值时应为一个元组,比如{cm,300}。

    可能有一天,想需要将函数的功能进行扩展,可以将厘米、毫米、分米通通转为米,那么你可能想,这需要在函数体中通过相关方法进行判断所传入的长度值的具体单位后,再计算并返回结果。然而,Erlang的模式匹配可以在函数的参数中运用后即可轻松实现:

    convert({cm,X}) ->        X / 100;    convert({dm,X}) ->        X / 10;    convert({mm,X}) ->       X / 1000.
    这样,当传入不同的参数时,由于在函数进入时进行了模式匹配,所以它就可以计算了正确的结果。

    如果你传入了{cm,300},匹配子句1则会输出3,如果输入了{dm,300},匹配子句2则会输出30。其在交互式环境运行结果如下图所示:

    当然,你还可以添加更多的标准单位计算。

    二、列表在函数参数中的模式匹配

    大多数程序设计语言,实现对列表的处理一般是在函数内部使用循环语句来实现的,而Erlang中是没有循环语句的。

    Erlang 中要实现循环的方法是用模式匹配和递归调用来完成对列表处理。其一般模式如下(本程序并无应用意义,只是用来说明问题的,但也是可以运行的):

    process([]) ->        0;    process([H|T]) ->       process(T).
    这里使用了列表的模式匹配。当传入非空列表时,通过模式匹配会执行第二个子句,此时,传入的列表被分为两部分,第一部分为H,即列表的第一个元素值,称为列表的头,第二部分为T,称为列表的尾,它是一个包含除了列表第一个元素外的所有元素的列表。而后递归调用process(T),传入的是列表的尾。这样不断的递归调用,总会到达T为空的(当列表只含一个元素时,执行模式匹配后,H匹配到唯一的一个元素,T匹配的结果为空列表)调用。这时,第一个子句会成功进行模式匹配,执行后,返回结果为0。

    例如传入参数[1,2,3],匹配的过程是:

    H=1 T=[2,3]

    H=2 T=[3]

    H=3 T=[]

原创粉丝点击