Что означает ошибка компилятора «head несоответствие»?
-
05-07-2019 - |
Вопрос
Я пытаюсь написать код для печати символа Z.
zzzzzzz
z
z
z
z
z
zzzzzzz
Но когда я компилирую этот код, он выдает
D:\erlang\graphics>erlc zeez2.erl
d:/erlang/graphics/zeez2.erl:19: head mismatch
d:/erlang/graphics/zeez2.erl:6: function zeez/3 undefined
Я не могу исправить эту ошибку.Я не нашел, что не так в моей банке.
Кто-нибудь, пожалуйста, предложите мне.
Спасибо.
-module(zeez2).
-export([main/0]).
main() ->
L = 8,
zeez( false ,1, L). % line 6
zeez(true, M,M) ->
init:stop();
zeez(false, M, N) ->
io:format("~p~n", [zeez(z, N-M)] ),
zeez(M rem N =:= 0, M + 1, N );
zeez(true, M, N) ->
io:format("~p~n", [zeez(space, N-M)] ), % line 16
zeez(M rem N =:= 0, M + 1 , N );
zeez(space, M) ->
io:format("~p~n", ["-" ++ zeez(space, M-1)] );
zeez(space, 0) ->
"Z";
zeez(z, M) ->
io:format("~p~n", ["Z" ++ zeez(z, M-1)] );
zeez(z,0) ->
"Z".
Решение
проблема в том, что вы перепутали 2 функции:
zeez / 2 и zeez / 3
Если вы завершаете функцию zeez / 3, заканчивая ее точкой с полной остановкой, а не точкой с запятой, она должна скомпилироваться:
zeez(true, M, N) ->
io:format("~p~n", [zeez(space, N-M)] ), % line 16
zeez(M rem N =:= 0, M + 1 , N ); <-- should end with .
Сообщение об ошибке означает: «Эй, я нахожусь в zeez / 3, и вы добавили предложение из двух артиклей, wtf?»
Другие советы
Вы пытаетесь определить две функции: первую с тремя параметрами (zeez/3), а другую с двумя параметрами (zeez/2).Ошибка несоответствия заголовка связана с тем, что функция zeez/3 в предыдущей строке должна завершаться символом '.'.
Т.е.поскольку вы завершили предыдущую функцию zeez/3 знаком ';', она ожидает, что следующее объявление будет еще одним совпадением для zeez/3:
zeez(true, M, N) ->
io:format("~p~n", [zeez(space, N-M)] ), % line 16
zeez(M rem N =:= 0, M + 1 , N ).
zeez(space, M) ->
io:format("~p~n", ["-" ++ zeez(space, M-1)] );
Также следует отметить, что компилятор выдаст вам предупреждения о «...предыдущее предложение в строке xxx всегда соответствует» из-за порядка zees(space, 0) и zeez(space, M).Вам следует поставить zees(space, 0) перед zeez(space, M), потому что это более конкретно.