首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Elixir在标准库中有这么多相似的列表类型?

为什么Elixir在标准库中有这么多相似的列表类型?
EN

Stack Overflow用户
提问于 2016-10-16 08:07:49
回答 3查看 324关注 0票数 2

我正在做仙人掌,我已经研究了五种不同的列表数据类型:

  • 列表
  • 查表
  • 词表
  • 元组
  • 关键词列表
  • 地图
  • MapSet
  • 结构

有些是我买的,但都是同时买的?是否有人将所有这些列表用于严格分离的目的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-16 08:33:45

简短的回答是:是的。

很长的答案是:

  • 列表-是你在任何地方使用的基本数据结构。列表是有序的,并允许重复。主要用例是:同质变长集合。
  • Charlists Elixir使用字符串(基于二进制文件),Erlang通常使用charlist(整数编码点列表)。它主要是一个兼容接口;
  • 字里行间--我从未听说过这些;
  • 元组-是你在任何地方使用的另一个基本数据结构。主要用例是:异质定长收藏;
  • 关键字列表-是非常常见的,主要用于选项。它是列表和元组之上的一个简单抽象(由两个元素元组组成的列表)。允许重复的键和保持键的顺序,因为它们是有序的模式匹配是非常不切实际的。
  • 地图-也很常见。允许在键上进行简单的模式匹配,但不允许重复的键,也不允许排序。
  • MapSet -集是一种基本的数据结构--一个无序的、唯一的元素集合.
  • Structs -是Elixir中多态的主要机制(通过协议),允许在编译时使用键集创建更严格的结构。

由于函数式编程选择了正确的数据结构来表示您的数据,这通常是问题的一半,这就是为什么您会得到这么多不同的结构,并具有不同的特性。每个用例都有它的用例,并且在不同的方面都很有用。

票数 9
EN

Stack Overflow用户

发布于 2016-10-16 12:45:52

@michalmuskala在这里给出了一个很好的答案,也许我只是稍微扩展了一下。

  • 列表是灵丹妙药中的活计。有很多问题你可以用清单来解决。列表不是数组,在这种情况下,随机访问是获取值的最佳方法,相反,链接数据结构中的列表是通过分头和尾遍历它们的(如果您知道LISP、Prolog或Erlang,您就会像在家里一样)。
  • Charlist只是列表,但缩小为整数列表。
  • 元组-通常包含两到四个元素。传递附加数据的方法很普遍,但仍然会发送一个参数。像、GenServer、等常见行为使用它们作为预期的答复。
  • 关键字列表是元组的列表,当需要存储一个以上的值时,可以使用它们。这是合成糖。而不是a = [{:name, "Patryk"}],您可以拥有a = [name: "Patryk"]并使用a[:name]访问它。
  • 映射是关联数组、散列、切分等。一个键持有一个值,而键是唯一的。
  • 想想看数学家的集合。唯一值的无序集合。
  • Struct -正如@michalmuskala所写的,它们在协议中使用,并由编译器检查。实际上,它们是为模块定义的映射。
票数 3
EN

Stack Overflow用户

发布于 2016-10-16 18:18:44

答案将自下而上阅读:)

@michalmuskala在这里给出了很好的答案,“帕特诺瓦克完美地扩展了它。我在这里的主要目的是回答以下问题:“是否有人将所有这些清单都用于严格分开的目的?”

灵丹妙药(以及Erlang)都是关于模式匹配。有了不同类型的列表,就很容易缩小每个特定情况下的模式匹配范围:

  • List主要用于递归;Erlang没有循环,而是执行递归调用。如果使用得当,它是高度优化的(尾递归)。通常匹配为[head | tail]
  • charlist用于“string”模式匹配,不管它的意思是什么。检查Erlang中的“他的名字的第一个字母是‘A’”将与[?A | rest] = "Aleksei" |> List.Chars.to_charlist进行模式匹配
  • Tuple用于多或少相同实体的不同实例的模式匹配.失败/成功将分别作为元组{:ok, result}{:error, message}返回,然后匹配模式。GenServer也简化了对不同消息的处理。
  • Map将被匹配为%{name: "Aleksei"} = generic_input,以立即提取nameKeywords或多或少是相同的。

等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40068243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档