如何在Elixir中键入规范泛型

Col*_*ege 3 generics erlang types elixir

我在elixir中有一个Balanced Search Tree的实现,它用作键值存储。

我有一个方法from_list,它接收键值元组的列表,并与它们一起返回一棵树。有没有办法像我在强类型语言中一样使用泛型来进行类型规范?

@spec from_list([{key_type, value_type}]) :: tree(key_type, value_type)
def from_list(list), do: 
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到一个错误。Elixir中有仿制药吗?还是我只需要使其成为{any,any}类型的列表?

Ale*_*nov 7

@spec from_list([{key_type, value_type}]) :: tree(key_type, value_type) when key_type: var, value_type: var
Run Code Online (Sandbox Code Playgroud)

来自Typespecs — Elixir [最新]

防护可用于限制作为函数参数提供的类型变量。

@spec function(arg) :: [arg] when arg: atom
Run Code Online (Sandbox Code Playgroud)

如果要指定多个变量,请用逗号分隔它们。

@spec function(arg1, arg2) :: [arg1, arg2] when arg1: atom, arg2: integer
Run Code Online (Sandbox Code Playgroud)

没有限制的类型变量也可以使用定义var

@spec function(arg) :: [arg] when arg: var
Run Code Online (Sandbox Code Playgroud)