假设我有这样的功能:
def something(callback) do
case *some condition* do
0 ->
:ok
1 ->
{:error, :foo}
_ ->
callback.()
end
end其中回调函数可以返回:ok或{:error, *some atom*},其中、某些原子、是未知原子。
现在,我想知道是否有一种方法可以为不使用通用something/1规范的atom函数编写规范。因此,问题是,基本上,是否有一种方法可以写出比这更具体的类型:
@spec something(() -> :ok | {:error, atom}) :: :ok | {:error, atom}相反,我希望我的规范显示something/1函数可以返回:ok、{:error, :foo}或callback返回的值。
我知道这类事情在实际层面上并不重要,所以这只是一个基于好奇心的问题。
发布于 2018-05-08 19:46:24
你在找类型变量。Erlang 支持宣布他们,但透析器似乎没有做任何基于这些类型的检查,目前(Erlang/OTP 20)。
可以在规范中使用类型变量来指定函数的输入和输出参数的关系。例如,以下规范定义了多态标识函数的类型: -spec id(X) -> X.
您想要的类型签名是:
@spec something(() -> t) :: :ok | {:error, atom()} | t发布于 2018-05-08 18:27:34
您可以为callback/0的返回类型定义一个@type callback_return_type :: atom,例如@type callback_return_type :: atom,然后使用:@spec something(fun()) :: :ok | :error | callback_return_type
我知道这类事情在实际层面上并不重要,所以这只是一个基于好奇心的问题。
为了确保一致性和避免代码重复,Typespec可组合性在较大的项目中确实很重要。您在module中声明的类型可以被其他modules重用,甚至可以将某些typespecs声明为private和opaque,这样就可以对它们的使用方式进行细粒度的控制,从而可以维护库用户的关注点分离。
https://stackoverflow.com/questions/50239660
复制相似问题