【问题标题】:What does the "head mismatch" compiler error mean?“头部不匹配”编译器错误是什么意思?
【发布时间】:2010-12-20 15:14:36
【问题描述】:

我尝试编写代码来打印 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".

【问题讨论】:

  • 可能是错字,但您也缺少函数终止符“。”在 main/0 的末尾

标签: erlang compiler-errors


【解决方案1】:

问题是你混淆了 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-arity 子句,wtf?'

【讨论】:

    【解决方案2】:

    您正在尝试定义两个函数,第一个具有 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 行的前一个子句总是匹配”的警告。您应该将 zees(space, 0) 放在 zeez(space, M) 之前,因为它更具体。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多