热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在列表中摆脱元组,erlang

如何解决《在列表中摆脱元组,erlang》经验,为你挑选了1个好方法。

我想摆脱列表中的所有元组,例如.

我有这样的东西作为输入

test:stack({push, [{{mul,{plus,{num,2},{num,3}},{num,4}},[]}]}, []). 
%% note:  (returns wrong output because of the multiple tuples brackets)

如果我有这样的事情:

proj:stack({push, [mul,plus,{num,2},{num,3},{num,4}]}, []). 
%% this would return: 
%% [{push,{num,4}},{push,{num,3}},{push,{num,2}},
%%  {push,plus},{push,mul}] 
%% This is near to what I need.

我的代码是这样的:

stack({push, []}, StackList) -> StackList;
stack({push,[H|T]}, StackList) ->   
stack({push, T}, [{push,H} | StackList]). 

我希望实现这样的目标:

{push, {num, 4}}, {push, {num, 3}}, 
{push, {num, 2}}, {add}, {mul}, {pop}, {ret}

我想过使用过滤器来实现这个目标,但也许是其他的东西?



1> zxq9..:

评论太大了.咩...

这看起来很像你正在尝试构建一个堆栈机器,在这种情况下可能是一个计算器.在LYSE中有一个很好的RPN示例演练,我强烈建议你看一下.它没有处理这种特定的语法,但它演示了如何使用函数头中的匹配来累积一组消耗性操作.

您必须决定的是元素的语义.现在你有元组元组的元组 - 这不是元组的用途.形式的元组{Operation, Operand}{Operation, Operand1, Operand2}完美的意义 - 它们在语义上是截然不同的 - 但是形式的元组{OperationZ, {OperationX, Operand}, {OperationQ, Operand1, Operand2}}没有任何意义,因为元组的每个元素应该具有不同的含义.在这里,您刚刚嵌套了一堆元组,这些元组具有自己的意义到一个更大的元组中,而这个元组本身现在只是混淆了.

解决方案是使用列表,而不是元组.如果你更进一步,而不是使用"push/pop"作为他们自己的操作,考虑完全展开你的元组,并根据系统基础的规则集,按照自己的条件处理列表的每个元素.因此,而不是将值包装在{push, 4}您的供应中,4因为隐式操作总是推送(或弹出,取决于您的观点...更好,实际上,放弃这个概念,因为堆栈已经作为输入存在).

从上面的例子中提取:

[{push,{num,4}},{push,{num,3}},{push,{num,2}},{push,plus},{push,mul}]

会成为

[4, 3, 2, add, mul]

这可以解释为没有歧义,我们不需要混淆pushnum标识符:

-module(rpn).
-export([calc/1]).

calc(List) ->
    [Res] = lists:foldl(fun calc/2, [], List),
    Res.

calc(mul, [N1, N2 | Stack]) -> [N1 * N2 | Stack];
calc(add, [N1, N2 | Stack]) -> [N1 + N2 | Stack];
calc(X, Stack) -> [X | Stack].

希望这说明不仅仅是困惑.请记住,您可以将所有内容都包含在元组中并匹配元组标记和值变量,但这不是必需的.上面的代码根本没有类型检查,但是如果你向元素添加标签(但嵌套元组),那么你可以使用这些标签作为类型标记的形式(如果你收到错误的标签就会立即崩溃,或者跳过任何意想不到的事情) - 但这意味着您需要在语义上进一步备份:

[{num, 4}, {num, 3}, {num, 2}, {op, add}, {op, mul}]

刚刚玩这个有点使代码变得复杂到一定程度,我真的宁愿只使用防护装置,如果输入不好就会提前崩溃.


推荐阅读
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
author-avatar
林振萍俊諭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有