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

时间:2016-10-16 08:07:50

标签: list types elixir

我正在做Elixir koans,而且我已经完成了五种不同的数据类型之类的工作:

  • 列表
  • Char list
  • 单词列表
  • 元组
  • 关键字列表
  • 地图
  • 地图集
  • STRUCT

我买的其中一些,但同时所有这些?有没有人真正将所有这些列表用于严格分开的目的?

3 个答案:

答案 0 :(得分:7)

简短回答是:是的。

答案很长:

  • 列表 - 是您在任何地方使用的基本数据结构。列表是有序的,并允许重复。主要用例是:同质变长集合
  • 查询列表 - Elixir使用字符串(基于二进制文件),Erlang通常使用字符串(整数代码点列表)。它主要是兼容性界面;
  • 单词列表 - 我从未听说过那些;
  • 元组 - 是您在任何地方使用的另一种基本数据结构。主要用例是:异构固定长度集合;
  • 关键字列表 - 非常常见,主要用于选项。它是列表和元组(两元素元组列表)之上的简单抽象。允许重复键并维护键的顺序,因为它们是有序的模式匹配是非常不切实际的。
  • 地图 - 也很常见。允许在键上轻松进行模式匹配,但不允许重复键,也不进行排序。
  • MapSet - 集合是一种基本数据结构 - 无序的,唯一的元素集合。
  • 结构 - 是Elixir中多态性的主要机制(通过协议),允许在编译时强制创建更严格的结构。

使用函数式编程选择正确的数据结构来表示数据通常是问题的一半,这就是为什么你会得到这么多不同结构,具有不同特征的原因。每个人都有它的用例,并且以不同的方式有用。

答案 1 :(得分:3)

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

  • 列表是Elixir的主力。您将通过列表解决许多问题。列表不是数组,其中随机访问是获取值的最佳方式,而Elixir中的列表是链接数据结构,您可以通过分割成头部和尾部来遍历它们(如果您知道LISP,Prolog或Erlang) ,你会喜欢在家里。)

  • 查询列表只是列表,但缩小为整数列表。

  • 元组 - 通常它们包含两到四个元素。传递附加数据的方法很常见,但仍然会发送一个参数。 GenServer 等常见行为将它们用作预期回复。

  • 关键字列表是元组列表,当您需要为一个键存储多个值时,可以使用它们。这是合成糖。 您可以a = [{:name, "Patryk"}]取代a = [name: "Patryk"]而不是a[:name],而不是gem "mailboxer"

  • 地图是关联数组,哈希,词组等。一个键包含一个值,键是唯一的。

  • Set - 想想数学家集。无序的唯一值集合。

  • Struct - 正如@michalmuskala所写,它们在协议中使用,并由编译器检查。实际上,他们为模块定义了地图。

答案 2 :(得分:2)

答案应从下到上阅读:)

@michalmuskala在这里提供了很好的答案,@ patnowak完美地扩展了它。我在这里主要回答的问题是“是否有人真正将所有这些列表用于严格分开的目的?”

Elixir(以及Erlang)都是关于模式匹配。使用不同类型的列表可以轻松缩小每种特定情况下的模式匹配:

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

等。