Erlang 是一种函数式编程语言,函数是其编程的基本单位,并且可以使用变量进行传递。本节介绍Erlang函数的定义方法和模式匹配在函数中的应用:

一、单子句函数(函数体只包含单表达式)

下面是一个基本的函数定义形式:

play(X) ->X.

该函数定义包括三个部分:

1.函数头:由函数名和被括号括起来的模式构成。函数名是一个原子,模式也可以理解为函数的参数。

2.分隔符:即“->”;

3.函数体:由一个或多个表达式组成。函数总是返回最后一个表达式的值,即最后一个表达式的值作为函数的返回值。函数体用“.”表示结束函数定义。

下图是在交互式环境下调用这个函数两次运行及其结果:

分别提供了参数3和{point,4,7.2}作为参数,运行结果即为这两个参数的值。注意在函数调用时,所给出的实际参数与定义时函数头中模式以模式匹配的形式进行绑定后,再进入函数中使用绑定后的变量。

二、含多个表达式的单子句函数

play2(X) ->X * 2,X * 3.

函数play2中函数头中也只有一个模式,但函数体中包括了两个表达式,它们之间用“,”隔开。

下图为一次调用实例:

在函数体中包括了两个表达式,函数在运行时会别计算X*2和X*3,但结果只返回最后一个表达式的值,即9。

三、多子句函数

play3(on) ->true;
play3(off) ->false.

在多子句函数定义时,有点像定义了两个函数,但它们之间是用“;”进行分隔的。而且每个子句都包含单子句函数的三个部分。此函数在定义时,两个子句的函数头中的模式分别为两个原子,即“on”和“off”,当调用函数时,给出的实际参数会按函数定义的顺序对函数头中给出的模式进行模式匹配,哪个子句匹配成功,则运行哪个子句,若没有一个匹配成功则报错。下图为三次调用及其运行结果:

第一次调用时,给出的实际参数为on,恰好与第一个子句中的模式on匹配,所以第一个子句得到运行,结果为true。

第二次调用时,给出的实际参数为off,恰好与第一个子句中的模式off匹配,所以第一个子句得到运行,结果为false。

第三次调用时,给出的实际参数为other,显然既不能与on匹配成功,又不能与off匹配成功,所以报错。

由此可见:多个子句具有根据所给参数选择执行不同功能的作用,从某种意义上说,类似于程序设计中的选择结构程序,但在Erlang中,它的意义不止于此。

此外,在Erlang中,可以同时定义两个相同名字的函数,只要其函数头中的模式数量不同即可。

Erlang函数与模式匹配相关推荐

  1. R语言使用str_remove函数和str_remove_all函数删除模式匹配的字符串:str_remove函数删除第一个模式匹配的字符串、str_remove_all函数删除所有模式匹配的字符串

    R语言使用str_remove函数和str_remove_all函数删除模式匹配的字符串:str_remove函数删除第一个模式匹配的字符串.str_remove_all函数删除所有模式匹配的字符串 ...

  2. 【Erlang】学习笔记-erlang基础语法

    一.关于erlang erlang是函数式编程语言,最初主要用在电信软件开发,他是面向并发编程的,和主流语言相比,主流语言并不能很好的利用多核CPU的资源,采取加锁的方式使得编程易出错,且锁也是耗资源 ...

  3. Erlang程序设计笔记---(第五节 Erlang的记录与映射组)

    导读 到目前为止,我们已经讨论了两种数据容器,分别是元组和列表.元组用于保存固定数量的 元素,而列表用于保存可变数量的元素. 本章将介绍记录(record)和映射组(map).记录其实就是元组的另一种 ...

  4. Rust 和Erlang的对比

    \ 本文要点: \\ Erlang提供轻量级流程.不变性.位置透明的分布式.消息传递.监督行为以及许多其他高级动态功能,这些特性使其成为容错.高可用性和可扩展系统的理想之选.\\t 不幸的是,在执行X ...

  5. 【转载】Erlang精彩讨论-回“老赵”关于“Erlang中最大的问题”

    原文:http://erlang-china.org/study/puzzle-in-erlang_pattern_match.html/comment-page-1#comments http:// ...

  6. Erlang/OTP之gen_fsm行为模式

    2019独角兽企业重金招聘Python工程师标准>>> 1. Fsm 称为 有限状态机,举个例子,游戏中的怪物称为NPC,NPC一般有几种状态,比如:静止,移动,死亡,被攻击,攻击英 ...

  7. 腐蚀函数cvErode 和 膨胀函数cvDilate

        Erode腐蚀, Dilate膨胀,这两个形态学函数总是成对出现,前者可以消除较小的点如噪音,后者可以使不连通的图像合并成块. void cvErode( const CvArr* src, ...

  8. Erlang/OTP设计原则(文档翻译)

    http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1. 这个设计原则,其实 ...

  9. stringr | 文本处理方法(Ⅰ-1):字符串处理函数(上)

    stringr是tidyverse系列包中专门用于文本处理的工具包,其中字符串处理的函数均遵循str_*的命名方式. library(stringr) 本篇先简单介绍部分str_*()系列函数. wo ...

最新文章

  1. 如何用纯 CSS 创作一个同心圆弧旋转 loader 特效
  2. Git常用命令总结(超实用)
  3. Luntik and Subsequences 思维
  4. [置顶]       设计模式之结构类模式——桥梁模式
  5. Android性能优化——内存泄漏优化
  6. matlab示波器有功功率,巧用示波器计算功率-测试测量-与非网
  7. centos清楚缓存
  8. Vue+springboot流浪宠物救助领养网站
  9. 城市信息学其五-空间经济学、城市信息学、和交通便利
  10. zTree插件setting配置详解
  11. Linux shell脚本文件的各种执行方式
  12. 【python技巧】RGB值组合三元色(红绿蓝)
  13. opencv-------高斯滤波
  14. 怎么批量生成100多条短视频素材
  15. 这么多大学,保证一志愿优先录取!
  16. flutter 相机加入mask(遮罩层)
  17. 关于语义分割预测出来的图片全黑的解决办法
  18. Altium Designer原理图转PCB板时报错是什么原因?
  19. 结缘OpenStack:运营商NFV部署加速 要开源也要保障
  20. ECMAScript 6 简明教程(一文搞懂ES6)

热门文章

  1. 外贸众多外贸公司选择TOM会员邮箱?
  2. 排列组合-正态分布-置信区间-假设检验
  3. linux系统pkl,pytorch模型 .pt, .pth, .pkl有什么区别及如何保存
  4. 利用计算机打开电视盒子,使用小米盒连接到计算机显示器以观看电视
  5. python绘制荷花_Python随想
  6. 将指定格式的文字进行格式替换更换字体颜色、字号、字形等
  7. STM32 VBAT外围电路接法详解--备用电源(纽扣电池)
  8. 电脑和手机之间的通讯(一)
  9. Abp 项目中接入开源日志面板LogDashboard (2)
  10. 魅族16作为高性价比旗舰机带领魅族走出新路