Понимание результата диализатора

У меня есть следующая функция:

-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.

Интересным открытием стало то, что диализатор не жалуется на приведенный выше код, когда я запускаю диализатор v2.8 и Erlang/OTP 18 на другой машине.

Вещи, которые я пробовал до сих пор:

  • Я не очень разбираюсь в двоичных файлах на эрланге, поэтому я сначала подумал, что неправильно понял сопоставление с двоичным шаблоном, но, похоже, это не так. Функция проходит мои тестовые случаи (вызов функции с [] в качестве параметра не вызывает проблем), а также, если я заменяю двоичные файлы обычными строками в функциональных головках, я получаю те же жалобы от диализатора.

  • Восстановил плт и почистил проект

заранее спасибо

1 ответ

Решение

Причиной предупреждений диализатора было то, что функция всегда вызывалась с [] из-за дефекта в моем коде.

Итак, в заключение: Диализер на этот раз тоже не ошибся:)

Другие вопросы по тегам