"头部不匹配"编译器错误是什么意思?

wea*_*ock 16 erlang compiler-errors

我试图编写代码来打印Z字符.

zzzzzzz
     z
    z
   z
  z
 z
zzzzzzz
Run Code Online (Sandbox Code Playgroud)

但是当我编译这段代码时,它会抛出

D:\erlang\graphics>erlc zeez2.erl
d:/erlang/graphics/zeez2.erl:19: head mismatch
d:/erlang/graphics/zeez2.erl:6: function zeez/3 undefined
Run Code Online (Sandbox Code Playgroud)

我无法修复此错误.我没有发现我的错误.
有人请建议我.
谢谢.

-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".
Run Code Online (Sandbox Code Playgroud)

Gor*_*rie 33

问题是你混淆了两个功能:

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 .
Run Code Online (Sandbox Code Playgroud)

错误消息的意思是,'嘿,我在zeez/3,你已经抛出了一个2-arity子句,wtf?'


bjn*_*ier 19

你试图定义两个函数,第一个有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)] );
Run Code Online (Sandbox Code Playgroud)

您还应该注意,由于zees(空格,0)和zeez(空格,M)的排序,编译器会给出关于"...... xxx行的前一个句子总是匹配"的警告.你应该在zeez(space,M)之前放置zees(space,0),因为它更具体.