我也学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}.当第一个子句匹配一个非空列表时,它会从列表中选中头部,对其进行一些处理,然后调用自身去处理列表的尾部。当被缩减至空列表时,就会匹配到第二个子句。