我正在做Elixir koans,而且我已经完成了五种不同的数据类型之类的工作:
我买的其中一些,但同时所有这些?有没有人真正将所有这些列表用于严格分开的目的?
答案 0 :(得分:7)
简短回答是:是的。
答案很长:
使用函数式编程选择正确的数据结构来表示数据通常是问题的一半,这就是为什么你会得到这么多不同结构,具有不同特征的原因。每个人都有它的用例,并且以不同的方式有用。
答案 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
进行模式匹配,以立即提取name
。 Keyword
或多或少相同。等。