“頭の不一致”コンパイラエラーはどういう意味ですか?
-
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にいるのに、2アリティ句、wtfをスローしましたか?」
他のヒント
2つの関数を定義しようとしています。1つは3つのパラメーター(zeez / 3)、もう1つは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)] );
また、コンパイラは&quot; ... xxx行目の前の句が常に一致する&quot;に関する警告を表示することにも注意してください。 zees(space、0)とzeez(space、M)の順序のため。 zeez(space、M)は、より具体的であるため、zeez(space、M)の前に配置する必要があります。
所属していません StackOverflow