2

我正在使用“-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,并且怀疑我正在违背原则,因为我能想到的唯一解决方案是一些复杂的函数保护......

任何想法或指示?

4

1 回答 1

2

-Woverspecs您的类型比 Dialyzer 自己的分析所能推断的更严格时,您会收到警告。

在您的实例中,当testU函数的参数不同于a.

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

于 2016-04-05T13:15:44.983 回答