为什么拥有原子类型(比如在 elixir、erlang 中)是有用的?

Why is useful to have a atom type (like in elixir, erlang)?

根据http://elixir-lang.org/getting-started/basic-types.html#atoms

Atoms are constants where their name is their own value. Some other languages call these symbols

我想知道拥有原子类型有什么意义。可能是为了帮助构建解析器或宏?但在日常使用中它如何帮助程序员?

顺便说一句:永远不要使用 elixir 或 erlang,只要注意它存在(也在 kdb 中)

它们基本上是可以轻松测试相等性的字符串。

考虑一个字符串。从概念上讲,如果字符串具有相同的内容,我们通常认为它们是相等的。例如,"dog" == "dog" 但 "dog" != "cat"。然而,要检查字符串的相等性,我们必须检查一个字符串中的每个字母是否等于另一个字符串中相同位置的字母,这意味着我们必须遍历字符串的每个元素并检查每个平等的性格。如果处理 Unicode 字符串并且必须考虑组成相同字符的不同方式(例如,字符 é 在 UTF-8 中有两种表示形式),这会变得有点麻烦。

如果我们将相同的字符串存储在内存中的相同位置,将会简单得多。然后,检查相等性将是一个简单的指针或索引比较。

由于将相同的字符串存储在内存中的相同位置,我们还可以为每种独特的字符串存储一个副本,而不管它在程序中使用了多少次,从而节省了一些内存以供常用-也使用字符串。

在更高层次上,使用原子还可以让我们以与整数等其他原始数据类型相同的方式来思考字符串。

原子是以自身为值的常量。 这是一个在分布式系统中非常有用的概念,在分布式系统中,常量可以在每个系统上以不同的方式定义,而原子是自包含的,不需要定义。

我认为 erlang 中最常见的用法之一是标记变量和消息,如 mipadi 所说,具有快速比较(模式匹配)的好处。

例如,您编写的函数可能会失败,具体取决于提供的参数、与服务器的连接状态或任何原因。一个非常频繁的用法是 return 元组 {ok,Value} 在成功的情况下,{error,Reason} 在错误的情况下。调用函数可以选择仅管理成功案例编码 {ok,Value} = yourModule:yourFunction(Param...)。这样做很明显你只考虑成功的情况,你直接从函数 return 中提取值,它很快,而且你不必与你的模块共享任何 header 来解码好的原子。

在消息中,您经常会看到 {add,Key,Value}{delete,Key}{delete_all}{replace,Key,Value}{append,Key,Value}...这些是显式消息,和之前说的优点一样:快速,灵敏,不占header...