了解透析器结果

Lim*_*men 1 erlang dialyzer

我有以下功能:

-spec check_connection_header(list()) -> atom().
check_connection_header([{<<"Connection">>, <<"close">>}|_]) ->
    close;

check_connection_header([{<<"Connection">>, <<"Close">>}|_]) ->
    close;

check_connection_header([{<<"connection">>, <<"close">>}|_]) ->
    close;

check_connection_header([{<<"connection">>, <<"Close">>}|_]) ->
    close;

check_connection_header([_|Rest]) ->
    check_connection_header(Rest);

check_connection_header([])->
    keep_alive.
Run Code Online (Sandbox Code Playgroud)

当我运行透析器时,我得到以下输出:

131: The pattern [{<<67:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<99:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 134: The pattern [{<<67:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<67:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 137: The pattern [{<<99:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<99:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 140: The pattern [{<<99:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<67:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 143: The pattern [_ | Rest] can never match the type []
Run Code Online (Sandbox Code Playgroud)

我对透析器很新,并且无法解释透析器的输出.我理解它是说函数的前5个子句不能匹配[],但这是我自己的故意,因为我匹配第六个子句中的空列表.

我的erlang版本是Erlang/OTP 19.0,我的透析器版本是v3.0.

一个有趣的发现是,当我在另一台机器上运行dialyzer v2.8和Erlang/OTP 18时,透析器不会抱怨上面的代码.

到目前为止我尝试过的事情:

  • 我对erlang中的二进制文件不太熟悉,所以我最初的想法是我误解了二进制模式匹配,但似乎并非如此.该函数通过我的测试用例(用[]调用函数作为参数是没有问题的),如果我用函数头中的普通字符串替换二进制文件,我得到透析器的相同投诉.

  • 重建plt并清理项目

提前致谢

Lim*_*men 8

透析器警告的原因是由于我的代码中存在缺陷,因此始终使用[]调用该函数.

所以得出结论:Dialyzer这次也没错:)