erlang中的元组与列表的区别与联系

erlang初涉及3_元组和列表 今天来看erlang的几个数据结构,或者说是Java里的集合 阅读详情

传送门:http://blog.chinaunix.net/space.php?uid=22566367&do=blog&id=1993490


在erlang程序设计中,元组与列表本人很容易混淆,不知道什么时候应该使用元组,什么时候应该使用列表,为此,我查阅了一些网上的资料,并添加了一些
自己的理解,如果有理解不到位的地方,欢迎大家指正。
    元组:
    将一定数量项组成在一起,就形成了一个单一的实体,并且若干个项之间使用逗号隔开,形成的整个实体使用{}括起来,这样就形成了一个元组。这个元组的概念有点像c语言中的结构体,因为在erlang程序中并没有结构体这个概念,因此为了描述一个实体多方面的属性值的时候就引用了这个概念,我们可以把这个元组的概念和c语言中的结构体概念对比着理解。另外,一旦元组创建之后,元组项的个数就不能再变化了。其实元组就是原子。
    例如,我们要描述一台电脑的时候可以这么来描述:
    {sunny_computer, {name, asus}, {memory, 2048}, {disk, 300}}
    细心的人可能发现,在这个元组当中我又一次嵌套了元组,是的,元组是可以嵌套的。
    总结一下:元组也是一个原子。
    列表:
    将不定数量的项组在一起,再加上[]括号,就形成了列表。列表的每一项可以是元组,也可以仍是列表,即列表是可以允许嵌套使用的。
    和元组的主要区别是列表是存储可变数目的东西,创建一个列表之后,我们仍然可以往其中增加项,当然可以删除项,因此列表使用的话比较灵活一些。
    例如,我们要描述张三买了一台电脑,李四买了一件新衣服:
    [{zhangsan, computer}, {lisi, clothes}]
    接着李四卖掉新衣服,买了一个外星人,王五买了拖拉机,准备当农民,这样的话,列表就变成了这样的:
    [{zhangsan, computer}, {lisi, ET}, {wangwu, tractor}]
    由此我们可以看出,列表中的项的个数是可以变化的,数目不定。
    元组与列表对比:
    (1)从创建的角度来说。
    在声明元组的时候,就自动创建了一个元组。
    而对于列表来说,创建一个列表有两种方式,一种是直接定义,例如:F=[abc];另外一种是在已经创建的基础上再次添加一个项,那新构成的这个仍然是列表。
    (2)从提取的角度来说。
    从元组中提取字段值的时候,我们一般使用的是“=”来提取,而对于列表来说,使用的仍然还是模式匹配,只不过对于列表来说的话,我们每一次只能提取这个列表的头部,也就说一次只能提取一个项。
    例如,对于元组提取元素的使用如下:
1> A={apple, orange, bag, love}.
{apple,orange,bag,love}
2> {B, C, _, _} = A.
{apple,orange,bag,love}
3> B.
apple
4> C.
orange
    对于列表的提取例子如下:
12> f().
ok
13> A=[fanying].
[fanying]
14> B=[yingfei|A].
[yingfei,fanying]
15> C=[flying|B].
[flying,yingfei,fanying]
16> [F|M]=C.
[flying,yingfei,fanying]
17> F.
flying
18> M.
[yingfei,fanying]
19>
    每一次“[Head|End]=F.”中,Head提取出来的是一个元素,而End提取出来的是还是一个列表。
    这里我们还有一个需要注意的地方,在我们写erlang程序的时候,通常的返回值如果是元组的话,我们使用一个变量进行匹配是可以的。例如:
^_^[sunny@sunny-laptop ~/erl_test]2$ cat fan.erl
-module(fan).

-export([test/0]).

test() ->
    case fun_test() of
        false ->
            io:format("Result is error!~n");
        {Result} ->
            io:format("Result is ~p~n", [Result])
    end.

fun_test() ->
    {fanying}.    %%{fanying, yingfei, fei} 这个返回值上面的匹配是有问题的
^_^[sunny@sunny-laptop ~/erl_test]3$
    在fun_test()函数中返回一个元组,这个元组在test()函数中使用一个变量进行匹配是可以的。当我们把fun_test()的返回值的元组的元素个数改为不止一个的时候,就会出现问题,因此一般我们再返回值列表的元素个数不确定的情况下,我们最好使用一个变量(去掉{}的方式来接收)来进行接收,而不是一个带有{Result}的方式进行接收。
    我们将上面的fun_test()函数返回的那个元组如果改为一个列表,结果会怎样呢?我们继续往下看:
^_^[sunny@sunny-laptop ~/erl_test]3$ cat fan.erl
-module(fan).

-export([test/0]).

test() ->
    case fun_test() of
        false ->
            io:format("Result is error!~n");
        [Result] ->
            io:format("Result is ~p~n", [Result])
    end.

fun_test() ->
    [fanying].    %%[fanying, yingfei, fei] 这个返回值上面的匹配是有问题的
^_^[sunny@sunny-laptop ~/erl_test]4$
    在fun_test()函数中返回了一个只有一个元素的列表,这个时候我们使用[Result]的形式进行匹配是正确的,但是如果我们将这个返回值改为[fanying, yingfei, fei]式的时候,就会出现问题。因此,如果返回值是一个列表,这个时候我们进行匹配的时候,最好使用变量来进行匹配,使用列表的“提取元素”方式进行元素的提取。
    对于这个问题我们在erlang编程的时候要切记,当初我就是由于疏忽了这一点,花费了很长的时间最后才找到了这个错误。

小结:
个人理解,仅供参考:元组相当于定长的数组,而列表相当于不定长的链表。


Erlang常见编程题_附解析 网上搜罗了很多Erlang阶段考核题发现这些出现频率很高,自己做了下带上解析发出来,也算是冷饭新炒,希望能让大家看个新鲜 阅读详情

相关推荐

雷达工程师避坑指南:STAP处理中,间歇采样转发干扰为什么这么难对付?

本文深入解析了STAP处理中间歇采样转发干扰(ISRJ)的挑战与应对策略。通过分析ISRJ的工作机制和自由度消耗问题,结合仿真数据对比,揭示了其与传统压制干扰的本质差异。文章还探讨了在工程实践中如何构建有效的防御体系,包括降维处理技术选择和混合架构设计,为雷达工程师提供了实用的避坑指南。

weixin_30530339的博客 272

【Erlang】五、基本数据类型——元组(tuple)

文章目录元组(tuple)1. 概念2. 创建元组3. 提取元组的值 元组(tuple) 1. 概念 元组可以理解为信息的集合,比如我们想用一个变量表示一个人: 名字:coco 性别:男 年龄:18 如果通过之前学到知识,我们可以用三个变量来表示 > Name = "coco". "coco" > Gender = "男". "男" > Age = 18. 18 那么我们用元组(tuple)来描述这些信息() CocoInfo = {"coco", "男", 18}. {"coco",

Coco的博客 1492

设计空间探索:乘法器设计的面积、延时、功耗优化

4-2压缩器在减少延迟方面表现出色,适用于需要快速压缩的场景。6-2压缩器在资源占用方面具有优势,能够减少压缩树的层次数量和逻辑门数量。优化功耗:通过合理组合不同类型的压缩器,可以在延迟、资源占用和功耗之间找到最佳平衡点,从而实现优化的设计目标。###参考资料。

SiArch的博客 1882

Erlang中常用数据结构原理及其实现

在 Erlang 中,元组、列表、字典和集合是常用的数据结构,它们分别适用于不同的场景和需求。在实际开发中,根据具体的问题和需求,选择合适的数据结构来存储和处理数据,可以提高代码的可读性和性能。Erlang 中的集合是基于红黑树实现的,可以通过模式匹配和内置函数来操作集合。在构造一个新的列表的时候,如果新的列表引用了其他列表,那么引用了其他列表的元素本身就是一个 Cons 单元格。Erlang 中的列表是可变的,可以使用模式匹配和内置函数来操作列表。列表的元素可以是任何类型的数据,也可以包含其他列表。

专注于全栈开发领域 2598

MuJoCo 相机图片怎么拿?视角调整获取物体图片及实时显示(附代码)

在Mujoco的仿真中,对于识别抓取场景来说,如何获得添加的body等物体的实时图像很重要,今天就分享下如何添加相机视角及可视化小方块(举例)的实时图片。复制一个scene.xml为scene_withcamera.xml,在xml中添加camera和小方块如下。设置xml文件中添加的相机body id。需要创建一个离屏渲染器。

darcsdn 2128

2021-8-14 EDK II编译

2021-8-14 EDK II 编译为什么要写这篇文章新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 为什么要写这篇文章 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo

qq_45775660的博客 2948

[转帖储存]erlang中的元组与列表的区别与联系

传送门:http://blog.chinaunix.net/space.php?uid=22566367&do=blog&id=1993490   在erlang程序设计中,元组与列表本人很容易混淆,不知道什么时候应该使用元组,什么时候应该使用列表,为此,我查阅了一些网上的资料,并添加了一些 自己的理解,如果有理解不到位的地方,欢迎大家指正。 元组: 将一定数量项组成...

feil110的专栏 248

从零到一:Gromacs伞形采样的实战避坑指南

本文详细介绍了Gromacs伞形采样技术的实战应用与避坑指南,涵盖核心原理、环境准备、参数设置、数据分析及性能优化等关键环节。特别针对蛋白质-配体结合自由能计算等典型应用场景,提供了弹簧常数设置、采样窗口间距等实用参数建议,帮助研究人员高效完成分子动力学模拟。

weixin_29243279的博客 516

Erlang复合数据结构基础之元组与列表

一、元组 前面介绍的整数、浮点数、原子等类型的数据,它们都是简单类型的数据。在生活中我们时常会用到一组数据,这一组数据由可能由多个相同类型的简单数据构成,也可能由多个不同类型的数据构成,比如描述一个人,会有姓名(可用原子描述)、身高(可用浮点数描述)、体重(可用浮点数描述)、年龄(可用整数描述)。这些如果单独存放则不得于数据的组织和使用,所以可以用元组来存放他们: {john,17.4,60.

cloveses的专栏 1410

深入YOLOv8内部核心:用RepNCSPELAN4深度重构主干网络,即插即用的高效涨点方案

本文提出了一种改进YOLOv8目标检测模型的方法,通过在YOLOv8中引入RepNCSPELAN模块来提高检测性能。该模块融合了RepVGG重参数化思想与CSP-ELAN结构,在保持推理速度的同时增强特征表达能力。实验结果表明,改进后的RepNCSPELAN-YOLOv8相比原模型在多项指标上均有提升:准确率从0.84提高到0.86,召回率从0.72提升至0.81,mAP50和mAP50-95也分别提高了0.06和0.04。文章详细介绍了模块设计原理和移植步骤,包括配置文件创建、代码修改等关键环节,为YOL

FJN110的博客 189

uni-app - 实现全屏自适应且不变形背景大图,设置一张图片占满全屏(根据手机或电脑尺寸自动拉伸背景图像),用于页面是一张平铺的大图做背景的情况,全端兼容

uni-app,vue.js,微信小程序-设置背景图自适应手机屏幕尺寸,页面中的背景图片高度和宽度自适应,UNI-APP里如何设置背景图自适应手机屏幕尺寸,如何实现一个图片铺满整个页面,并且可以根据用户机型进行自动修正,自适应背景大图片官方教程,一个页面如何将图像放到背景上,纯CSS实现,设置背景图片占满全屏,3种CSS实现背景图片全屏铺满自适应的方式,uni-app中如何让图片不带高度的自适应,兼容uni-app全端,支持【纯】微信小程序项目使用,uni-app-实现全屏自适应且不变形背景大图

🏆 前端领域优质创作者 1万+

Erlang基本数据类型

1. 整数 Integer     Erlang可表示任意大的整数,大整数自动转换成bignums类型,比固定大小的整数类型相对效率较低。     Base#Value 表示基数不是10的整数。如:2#1010     -16#EA     #Character 表示字符的ASCII码。如:$a  $\n 2. 浮点数 Float 3. 基元 Atom:表示文字常量         相

铿锵玫瑰的专栏 1322

DISM进行系统修复,进度条卡在63.2%的解决方法

一时用不了软件,安装修复的时候也出现问题 DISM一直卡在63.2%,等了好久时间,直接强制退出寻找最终的解决方案

码农研究僧的博客 1万+

erlang面试题

【代码】erlang面试题。

游戏全栈,技术合作 855

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Erlang语言的数据类型

元组中的每个元素都可以是任意的数据类型,包括整数、浮点数、字符串、原子、列表等,甚至还可以嵌套包含其他元组。元组是Erlang语言中一种非常有用的数据类型,它能够有效地组织和存储多类型数据,支持模式匹配和高效访问,是实现高并发、高性能应用的重要工具。在Erlang这门语言中,元组(Tuple)是一种重要的数据类型,它像一个小型的数据容器,可以存放各种类型的数据。元组在内存中占用的空间较小,访问速度也更快,因此在需要快速访问且不需要修改的情况下,元组是更好的选择。《元组:Erlang语言中的数据组织者》

2401_90031853的博客 317

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

erlang 元组列表互转c源码 和 区别

/* convert a tuple to a list */ BIF_RETTYPE tuple_to_list_1(BIF_ALIST_1) { Uint n; Eterm *tupleptr; Eterm list = NIL; Eterm* hp; // 判断是否是元组 if (is_not_tuple(BIF_ARG_1)) { BIF_ERROR(BIF_P, BADARG); } // 获取头地址 tuplept

qq_41387404的博客 216

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[python01] python列表,元组对比Erlang的区别总结

数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字,字符,甚至可以是其他的数据结构。 python最基本的数据结构是sequence(序列):6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象。 对比归纳:列表,元组在Erlang与python中的区别: 1. 通用操作: Python的列表更像是C中的数组,但...

weixin_30242907的博客 139

【Erlang学习总结】Erlang中文版第二章学习总结

1、Erlang的安装和环境path值的搭建 在shell中输入 erl 查看是否安装成功,及所安装的Erlang版本 注意:在shell中仅仅能够对Erlang表达式求值,除此之外的其他事情,它都做不了!(也可以运用Erlang的库函数和fun函数) 2、整数运算 Erlang遵循标准运算规则 Erlang中 = 号的意思为 模式匹配符,而不是赋值! 3、变量 变量仅可...

derAugenstern的博客 381

云计算项目中遇到erlang的几个小问题

下面的几个小问题是今年暑假在做项目的时候遇到的,当时也花了不少的时间去把这些问题搞清了,现在有些遗忘,把那几个问题重新翻出来,和大家一起分享一下。经过这几天的努力,可能有那么一小点的收获,但是和实际要求可能查得还远些。下面是昨天我遇到的问题的解决,这三个问题花费的时间比较多些。问题1总结:在源代码中是D = os:cmd("get_node_resource.sh") -- "\n"但是在我的机子

sunjiangangok的博客 299

erlang中的记录和映射组

erlang 有四种复合数据结构:列表,元祖,记录,映射组。 列表可变大小,格式为 […],主要利用 [H|T] 这样的形式; 元祖放置固定元素,格式为 {…}; 记录 记录需要声明到.erl或.hrl文件(相当于c语言中的.h文件)。 格式:-record(Name,{key1=value1,key2=value2}). 其中的value1,value2代表默认值。 注意:Name,k...

qq_37744360的博客 525

erlang 变量存储在哪里_erlang 基础知识

一 数据类型1. 整数 IntegerErlang可表示任意大的整数,大整数自动转换成bignums类型,比固定大小的整数类型相对效率较低。Base#Value 表示基数不是10的整数。如:2#1010 -16#EA$Character 表示字符的ASCII码。如:$a $\n2. 浮点数 Float3. 原子 Atom:表示文字常量相当于C语言中的#define,Java中的“stat...

weixin_35636570的博客 219

Erlang顺序编程之一 数据类型

Erlang初识

Nassue_sn的博客 573

Erlang开发笔记之数据类型

1、变量与模式匹配 首先,要知道两点。第一,erlang是一种并发性语言,天生支持并发和分布式。第二,erlang是函数式编程。 基于这两点,erlang在语法上与C/C++/JAVA等语言会有很大的区别。 (1)erlang也有变量,但它的变量更像C++中的指向常量的常量指针,它指向内在中的一个固定区域,这个区域里面的值是不可变的,因此erlang变量只能赋一次值。 (2)erlang的

xingxinmanong的博客 665

《Learn You Some Erlang for Great Good!》的学习笔记(二)

和学习其它语言类似,目前我们还没有到直接编程的地步,首先从简单的熟悉Erlang Shell开始,枯燥的介绍就不多说了,在linux/mac环境下,直接输入erl既可进入erlang shell。但这里有个小技巧值得介绍一下,在shell中输入li,接着按下TAB键,他就会自动补全成lists:,紧接着如果再次按下TAB键,就会将lists模块下的所有函数全部打印出来。对于shell的常用命令,可

jjxojm的专栏 707
上一篇: linux下bin文件如何安装总结
下一篇: ubuntu install eclipse
sslf
博客等级 码龄23年 2粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值