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

  • 相关阅读:
    Hdu4547CD操作离线lca
    1036: [ZJOI2008]树的统计Count树链剖分
    light1348Aladdin and the Return Journey树链剖分
    Problem 2082 过路费树链剖分
    2243: [SDOI2011]染色树链剖分
    Poj3237Tree 树链剖分
    Poj2763Housewife Wind树链剖分
    Hdu5087Revenge of LIS II简单dp
    Hdu5088Revenge of Nim II高斯消元
    Bootstrap入门学习笔记(只记录了效果)
  • 原文地址:https://www.cnblogs.com/church/p/2591929.html
Copyright © 2011-2022 走看看