首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递函数的返回值的Typespec声明

传递函数的返回值的Typespec声明
EN

Stack Overflow用户
提问于 2018-05-08 17:59:24
回答 2查看 823关注 0票数 0

假设我有这样的功能:

代码语言:javascript
复制
def something(callback) do
  case *some condition* do
    0 ->
     :ok
    1 ->
      {:error, :foo}
    _ ->
      callback.()
  end
end

其中回调函数可以返回:ok{:error, *some atom*},其中、某些原子、是未知原子。

现在,我想知道是否有一种方法可以为不使用通用something/1规范的atom函数编写规范。因此,问题是,基本上,是否有一种方法可以写出比这更具体的类型:

代码语言:javascript
复制
@spec something(() -> :ok | {:error, atom}) :: :ok | {:error, atom}

相反,我希望我的规范显示something/1函数可以返回:ok{:error, :foo}callback返回的值。

我知道这类事情在实际层面上并不重要,所以这只是一个基于好奇心的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-08 19:46:24

你在找类型变量。Erlang 支持宣布他们,但透析器似乎没有做任何基于这些类型的检查,目前(Erlang/OTP 20)。

可以在规范中使用类型变量来指定函数的输入和输出参数的关系。例如,以下规范定义了多态标识函数的类型: -spec id(X) -> X.

您想要的类型签名是:

代码语言:javascript
复制
@spec something(() -> t) :: :ok | {:error, atom()} | t
票数 3
EN

Stack Overflow用户

发布于 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声明为privateopaque,这样就可以对它们的使用方式进行细粒度的控制,从而可以维护库用户的关注点分离。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50239660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档