types - Elixir、透析器、类型和子类型警告

标签 types elixir dialyzer

我正在使用“-Woverspecs”运行 Dialyzer 并收到此警告:

room_channel.ex:143:
Type specification 'Elixir.Backend.RoomChannel':
testU(a) -> a when is_subtype(a,#{})
is a subtype of the success typing: 'Elixir.Backend.RoomChannel':testU(_) -> any()

使用此代码:

@spec testU( a ) :: a when a: %Backend.User{}
def testU(u) do
...

我想做的是用一个防护来确定函数类型,以便子类型警告消失,并且我对我的函数有一个精确的定义。

我在 Erlang 文档中看到 -Woverspecs 不被鼓励,并怀疑我正在违背原则,因为我能想到的唯一解决方案是一些复杂的函数保护......

有什么想法或指示吗?

最佳答案

使用-Woverspecs,当您的类型比 Dialyzer 自己的分析可以推断出的限制性更强时,您会收到警告。

在您的实例中,当 testU 函数的参数与 a 不同时,它也可能返回一个值。

您可能正在寻找的是 -Wunderspecs,当您的规范比 Dialyzer 可以推断的更加宽松时,它会生成警告。

关于types - Elixir、透析器、类型和子类型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36424170/

相关文章:

erlang - 转换到 `any()` 是让 Dialyzer 接受 ETS 匹配模式的好解决方案吗?

erlang - 静态分析与静态类型

list - 将无限列表的表示理解为 haskell 中部分列表的限制

JavaScript 数据类型

elixir - Ecto 简单外键

dictionary - Elixir 按条件过滤映射条目

macos - "iex -S mix"返回错误服务器无法在 Mac 中启动

types - Elixir 类型规范和参数化类型变量

c++ - 根据特定成员是否存在来专门化模板

c++ - sympy ccode 数字类型