了解透析器结果

时间:2016-08-08 06:05:47

标签: 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.

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

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 []

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

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

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

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

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

  • 重建plt并清理项目

提前致谢

1 个答案:

答案 0 :(得分:7)

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

总而言之:Dialyzer这次也没有错:)或者