Erlang极简学习笔记<03>——函数篇

  • Erlang中定义函数时可以使用模式匹配,形式如下:

    function(X) ->
        Expression;
    function(Y) ->
        Expression;
    function(_) ->
        Expression.
    
  • 其中的每一条函数声明都被称作一个函数子句(function clause)。函数子句之间必须用分号;分隔,所有函数子句一起形成一个完整的函数定义,最后一个函数子句必须以句点.结尾

  • 在Erlang中变量的值永远不能改变!

  • 如果给一个已经绑定的变量赋值,除非这个新值和变量原有的值相同,否则就会引发错误

  • 在函数头中可以使用=操作符,这样可以在匹配元组内部元素({X, Y})的同时,匹配整个元组

    point(Point = {X, Y}) ->
        io:format("Point: ~p~n", [Point]),
        io:format(" X: ~p, Y: ~p~n", [X, Y]).
    
  • 卫语句是附加在函数头中的语句,能够让模式匹配更具表达力

  • 卫表达式有一条基本规则,想要成功,它必须返回true。如果返回了false或者抛出了异常,就表明卫语句失败

    old_enough(X) when X >= 16, X =< 104 -> true;
    old_enough(_) -> false.
    
  • 在卫表达式中,逗号(,)的作用和操作符andalso类似,分号(;)和orelse类似

    wrong_age(X) when X < 16; Y > 104 -> true;
    wrong_age(_) -> false.
    
  • 函数可以带有任意多个由逗号分隔的卫表达式,这些卫表达式必须都是成功,整个卫语句才能通过

  • 卫语句除了使用比较和布尔操作,还可以使用算术运算符(A*B/C >= 0)和判断数据类型的函数(is_integer/1, is_atom/1)

  • 卫语句有一个缺点,考虑到副作用方面的原因,卫语句中不能使用用户自定义函数

  • if语句又称为卫模式(guard pattern),if语句的作用和卫语句类似,和卫语句的语法也一样,但是它在函数子句头之外使用

  • Erlang中的if和其他大多数语言中见到的if不同,和那些if语句相比,Erlang版本的if像个怪物

    -module(what_the_if).
    -export([heh_fine/0]).
    
    heh_fine() ->
        if 1 =:= 1 ->
            works
        end,
        if 1 =:= 2; 1 =:= 1 ->
            works
        end,
        if 1 =:= 2, 1 =:= 1 ->
            fails
        end.
    
  • Erlang中每个表达式都必须有返回值,if表达式也不例外

  • 当Erlang无法让卫表达式成功时就会崩溃

  • 其他语言中的else在Erlang会使用true

    oh_god(N) ->
        if N =:= 2 -> might_success;
        true -> always_does %%这是Erlang if 的 else!
        end.
    
  • Erlang的if表达式可以有多个卫语句。再次强调!任何表达式都必须要有返回值

    help_me(Animal) ->
        Talk = if Animal == cat -> "meow";
                  Animal == beef -> "mooo";
                  Animal == dog -> "bark";
                  Animal == tree -> "bark";
                  true -> "fgdadfgna"
                end,
        {Animal, "says" ++ Talk ++ "!"}.
    
  • Erlang中没有像null值(如:Lisp中的nil,C中的NULL或者Python中的None)这样的东西

  • case...of表达式就像函数头,可以使用复杂的模式匹配,还可以使用卫语句

    beach(Temperature) ->
        case Temperature of
            {celsius, N} when N >= 20, N =< 45 ->
                'favorable';
            {kelvin, N} when N >= 293 , N =< 318 ->
                'scientifically favorable';
            {fahrenheit, N} when N >= 68, N =< 113 ->
                'favorable in the US';
            _ ->
                'avoid beach'
        end.
    

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容