Что означает ошибка компилятора несоответствия заголовка?

Я пытаюсь написать код для печати символа 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".

person wearetherock    schedule 26.11.2009    source источник
comment
Возможно, опечатка, но вам также не хватает терминатора функции '.' в конце main/0   -  person Simeon Pilgrim    schedule 27.11.2009


Ответы (2)


проблема в том, что вы перепутали 2 функции:

Зиз/2 и Зиз/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, а вы добавили пункт с двумя ариями, что ли?»

person Gordon Guthrie    schedule 26.11.2009

Вы пытаетесь определить две функции, первая с 3 параметрами (zeez/3), а другая с 2 параметрами (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 (пробел, 0) и zeez (пробел, M). Вы должны поставить zees(пробел, 0) перед zeez(пробел, M), потому что это более конкретно.

person bjnortier    schedule 26.11.2009