我也学erlang(二)

函数:

  举例如下:

-module(geometry).
-export([area/1]).
area({rectangle,Width,Ht})->Width*Ht;
area({circle,R})          ->3.14159*R;
area({square,X})          ->X*X.

  area函数有两个子句组成,子句间以分号分割,最后一条子句以句号结束。每一个子句都有一个函数头和一个函数体,函数头由函数名和随后以括号括起来的模式组成,函数体则由一系列表达式组成,如果函数头中的模式与调用参数匹配成功的话,其对应的表达式就会计算。模式将会按照它们出现在函数定义中的先后顺序进行匹配。

下面看一个稍微有点复杂一点的例子(购物系统)

shop.erl

-module(shop).
-export([cost/1]).

cost(oranges)           ->5;
cost(newspaper)         ->8;
cost(apples)            ->2;
cost(pears)             ->9;
cost(milk)              ->7.

若想计算清单之中所有物品的总价格,可以用下面的这种方式来达到目的:

-module(shop1).
-export([total/1]).

total([{What,N}|T])         ->shop:cost(What)*N+total(T);
total([])                   ->0.

执行下面命令之后,输出如下:

10> shop1:total([{pears,6},{milk,3}]).
75

模式匹配为:total函数第一个子句的匹配情况是What->pears,N->6,T->{milk,3}.执行结果为:cost(pear)*6+total([{milk,3}]).所以输出75.

总结:在结束本节之前,我们更加细致的观察total函数,total(L)通过分析参数L的各种不同条件来工作。L有两种情况,空列表或者非空列表。对于这两种情况,我们都编写一种子句来进行处理:

total([Head|Tail])      ->some_function(Head)+total(Tail);
total([])                   ->0.

在这个例子中,Head是一个模式{What,N}.当第一个子句匹配一个非空列表时,它会从列表中选中头部,对其进行一些处理,然后调用自身去处理列表的尾部。当被缩减至空列表时,就会匹配到第二个子句。

posted on 2012-07-14 23:13  百万军中  阅读(214)  评论(0编辑  收藏  举报