Elixir typespec的类型在括号中由管道操作符分隔,其含义是什么?

Elixir typespec的类型在括号中由管道操作符分隔,其含义是什么?,elixir,typespec,Elixir,Typespec,我正在向Elm移植一个Elixir库,该库大量使用类型规范,但我很难找到有关所用语法的文档 下面的类型表达式表示什么 @type identifier :: (String.t | MyCustomTypeA.t | MyCustomTypeB.t) 最初,我将它建模为一个元组,但现在我正在查看它的用法,它看起来可能是一个有区别的联合。但是,这个假设的问题是,我在这里没有看到任何支持这些东西的文档()。你是正确的,因为这是一个歧视性的联盟。Elixir和Erlang文档都没有直接指出这一点,但

我正在向Elm移植一个Elixir库,该库大量使用类型规范,但我很难找到有关所用语法的文档

下面的类型表达式表示什么

@type identifier :: (String.t | MyCustomTypeA.t | MyCustomTypeB.t)

最初,我将它建模为一个元组,但现在我正在查看它的用法,它看起来可能是一个有区别的联合。但是,这个假设的问题是,我在这里没有看到任何支持这些东西的文档()。

你是正确的,因为这是一个歧视性的联盟。Elixir和Erlang文档都没有直接指出这一点,但可以从更深入的文档中推断出来()

唯一真正需要的是电话线

所有其他类型都是由预定义类型的联合生成的

在您的示例中,括号不是必需的。你也可以把它写成

@type identifier :: String.t | MyCustomTypeA.t | MyCustomTypeB.t
这意味着
identifier
可以是
String.t
MyCustomTypeA.t
,也可以是
MyCustomTypeB.t

Elixir从Erlang继承了这一点,在

(请记住,虽然Elixir构建在Erlang上,但语法有点不同)

Erlang有联合类型,它允许您描述一个包含两个原子的类型,还有内置类型,它们是预定义的类型,不一定可以手工构建,而且它们通常很有用

[…剪断…]

表示类型并集的符号是管道(|)。基本上,这让我们可以说,一个给定的类型TypeName被表示为Type1 | Type2 |…|的并集TypeN。因此,number()类型(包括整数和浮点值)可以表示为integer()| float()。布尔值可以定义为“真”|“假”。也可以定义仅使用一种其他类型的类型。虽然它看起来像一个联合类型,但实际上是一个别名


如果有人想发送PR来改进文档,我们绝对欢迎。:)希望避免一点混乱。在Elixir中,
称为管道操作符。不是typespec中的
|