“頭の不一致”コンパイラエラーはどういう意味ですか?

StackOverflow https://stackoverflow.com/questions/1802680

  •  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)の前に配置する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top