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

时间:2009-11-26 09:52:01

标签: erlang compiler-errors

我尝试编写代码来打印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 个答案:

答案 0 :(得分: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 .

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

答案 1 :(得分: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)] );

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