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

List 为什么Elixir在标准库中有这么多类似的列表类型?,list,types,elixir,List,Types,Elixir,我正在做,我已经完成了五种不同的列表数据类型: 名单 字符表 词表 元组 关键词列表 地图 地图集 结构 我买了一些,但所有的都是同时买的?有人真的将所有这些列表用于严格分开的目的吗?简短的回答是:是的 答案是: 列表-是您在任何地方使用的基本数据结构。列表是有序的,允许重复。主要用例是:同质变长集合 字符列表-Elixir使用字符串(基于二进制文件),Erlang通常使用字符列表(整数代码点列表)。它主要是一个兼容接口 单词表——我从未听说过这些 元组-是您在任何地方使用的另一种基本数据

我正在做,我已经完成了五种不同的列表数据类型:

  • 名单
  • 字符表
  • 词表
  • 元组
  • 关键词列表
  • 地图
  • 地图集
  • 结构
我买了一些,但所有的都是同时买的?有人真的将所有这些列表用于严格分开的目的吗?

简短的回答是:是的

答案是:

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

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

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

  • 列表是长生不老药的主力。你可以用列表解决很多问题。列表不是数组,在数组中,随机访问是获取值的最佳方式,相反,Elixir中的列表是链接的数据结构,您可以通过拆分为头和尾来遍历它们(如果您知道LISP、Prolog或Erlang,您将像在home中一样)

  • 字符表只是列表,但仅限于整数列表

  • 元组-通常包含两到四个元素。有一些常见的方法可以传递额外的数据,但仍然发送一个参数。常见行为,如GenServer等,将其用作预期回复

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

  • 映射是关联数组、散列、dict等。一个键保存一个值,并且键是唯一的

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

  • Struct-正如@michalmuskala所写,它们用于协议中,并由编译器进行检查。实际上,它们是为模块定义的映射


答案从下到上阅读:)


@米恰尔穆斯卡拉在这里提供了很好的答案,@patnowak完美地扩展了它。我来这里主要是为了回答这个问题:“有人真的将所有这些列表用于严格分开的目的吗?”

Elixir(以及Erlang)都是关于模式匹配的。拥有不同类型的列表可以很容易地缩小每个特定情况下的模式匹配范围:

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

等等。

请澄清您所说的单词列表是什么意思。单词列表是您在字符串上使用
w
w
符号时生成的。谢谢,