Erlang函数与模式匹配

来源:互联网 发布:java跳转到jsp 编辑:程序博客网 时间:2024/05/22 07:06

    Erlang 是一种函数式编程语言,函数是其编程的基本单位,并且可以使用变量进行传递。本节介绍Erlang函数的定义方法和模式匹配在函数中的应用:

    一、单子句函数(函数体只包含单表达式)

    下面是一个基本的函数定义形式:

play(X) ->    X.
    该函数定义包括三个部分:

   1.函数头:由函数名和被括号括起来的模式构成。函数名是一个原子,模式也可以理解为函数的参数。

   2.分隔符:即“->”;

   3.函数体:由一个或多个表达式组成。函数总是返回最后一个表达式的值,即最后一个表达式的值作为函数的返回值。函数体用“.”表示结束函数定义。

   下图是在交互式环境下调用这个函数两次运行及其结果:

   分别提供了参数3和{point,4,7.2}作为参数,运行结果即为这两个参数的值。注意在函数调用时,所给出的实际参数与定义时函数头中模式以模式匹配的形式进行绑定后,再进入函数中使用绑定后的变量。

   二、含多个表达式的单子句函数

play2(X) ->    X * 2,    X * 3.
   函数play2中函数头中也只有一个模式,但函数体中包括了两个表达式,它们之间用“,”隔开。

下图为一次调用实例:

   在函数体中包括了两个表达式,函数在运行时会别计算X*2和X*3,但结果只返回最后一个表达式的值,即9。

   三、多子句函数

play3(on) ->    true;play3(off) ->    false.
   在多子句函数定义时,有点像定义了两个函数,但它们之间是用“;”进行分隔的。而且每个子句都包含单子句函数的三个部分。此函数在定义时,两个子句的函数头中的模式分别为两个原子,即“on”和“off”,当调用函数时,给出的实际参数会按函数定义的顺序对函数头中给出的模式进行模式匹配,哪个子句匹配成功,则运行哪个子句,若没有一个匹配成功则报错。下图为三次调用及其运行结果:

   第一次调用时,给出的实际参数为on,恰好与第一个子句中的模式on匹配,所以第一个子句得到运行,结果为true。

   第二次调用时,给出的实际参数为off,恰好与第一个子句中的模式off匹配,所以第一个子句得到运行,结果为false。

   第三次调用时,给出的实际参数为other,显然既不能与on匹配成功,又不能与off匹配成功,所以报错。

   由此可见:多个子句具有根据所给参数选择执行不同功能的作用,从某种意义上说,类似于程序设计中的选择结构程序,但在Erlang中,它的意义不止于此。

   此外,在Erlang中,可以同时定义两个相同名字的函数,只要其函数头中的模式数量不同即可。