gpt4 book ai didi

erlang - 透析器错过了类型规范的错误

转载 作者:行者123 更新时间:2023-12-05 01:30:08 26 4
gpt4 key购买 nike

下面的 Erlang 代码在其类型规范中似乎有一个明显的错误,但是dialyzer 说一切正常。我误解了还是这是透析器中的错误?在 Erlang 19.3 上运行

-module(foobar).

-export([foo/1]).

-spec foo(atom()) -> ok | {error, atom()}.
foo(Arg) -> bar(Arg).

-spec bar(atom()) -> ok | error.
bar(baz) -> error;
bar(_) -> ok.

最佳答案

首先是一个简短的回答,使用 Dialyzer 的格言:

  • 透析器永远不会错。 (Erlang程序员经常背诵)
  • Dialyzer 从未 promise 会找出代码中的所有错误。 (没那么有名)

  • 准则 2 是对任何“为什么 Dialyzer 没有发现此错误”问题的(诚然不是很令人满意)“标准”答案。

    更解释性的答案:

    Dialyzer 对函数返回值的分析经常进行过度近似。因此,类型中包含的任何值都被视为“可能返回”值。这有一个不幸的副作用,有时肯定会返回的值(例如您的 error 原子)也被视为“可能返回”。 Dialyzer 必须保证最大值 1(永远不会出错),因此在“可能返回”意外值的情况下,它不会发出警告(在 foo 的规范中),除非没有实际指定的值可以返回。最后一部分在整个函数级别进行检查,因为在您的示例中,某些子句确实返回 ok ,不会产生警告。

    最后,如果您希望 Dialyzer 对规范非常严格,您可以使用 -Wunderspecs-Woverspecs-Wspec_diffs (请参阅有关这些功能的文档)

    关于erlang - 透析器错过了类型规范的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49091334/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com