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.
    

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容