【问题标题】:Elixir, Dialyzer, Types and Subtyping WarningsElixir、Dialyzer、类型和子类型警告
【发布时间】:2016-04-05 21:16:33
【问题描述】:

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

有什么想法或建议吗?

【问题讨论】:

    标签: types elixir dialyzer


    【解决方案1】:

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

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

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

    【讨论】:

    • 问题的目的是如何更加严格——不管是可能的还是实用的
    • 这就是我要说的。如果你想在你的规范“松散”时得到警告,你应该使用 Wunderspec
    • 我希望我的规格是限制性的。例如,我可以想象一个限制性规范在一个函数上强制执行 Ints,然后添加一个只允许 Ints 的守卫。但我不知道如何为更复杂的类型添加警卫
    • 即Woverspec 对我来说没问题 - 我的目标是让功能更具限制性。不知何故,我认为这不是预期的用途,也许我需要稍微调整一下我的期望:)
    • Dialyzer 将始终检查/假定对函数的调用使用规范及其自身分析所允许的最严格类型。为了精确匹配您的类型,我个人会避免添加警卫,除非该函数是您的“公共”接口的一部分,并且您希望在边界进行所有输入完整性检查。
    猜你喜欢
    • 2018-03-01
    • 2018-02-25
    • 1970-01-01
    • 2020-05-22
    • 2019-05-27
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多