我有以下功能:
-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并清理项目
提前致谢
答案 0 :(得分:7)
透析器警告的原因是由于我的代码存在缺陷,因此始终使用[]调用该函数。
总而言之:Dialyzer这次也没有错:)或者