2009-11-26 3 views
11

Je tente d'écrire du code pour imprimer le caractère Z.Que signifie l'erreur de compilateur "incompatibilité de la tête"?

zzzzzzz 
    z 
    z 
    z 
    z 
z 
zzzzzzz 

Mais quand je compile ce code, il jette

D:\erlang\graphics>erlc zeez2.erl 
d:/erlang/graphics/zeez2.erl:19: head mismatch 
d:/erlang/graphics/zeez2.erl:6: function zeez/3 undefined 

Je ne peux pas fixe cette erreur. Je n'ai pas trouvé ce qui ne va pas dans ma vie.
Est-ce que l'un me suggère s'il vous plaît.
Merci.

-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". 
+0

Peut-être une faute de frappe, mais il vous manque également la terminaison de fonction '.' à la fin de la main/0 –

Répondre

29

le problème est que vous avez mélangé 2 fonctions:

Zeez/2 et Zeez/3

Si vous résiliez la fonction Zeez/3 en terminant avec un arrêt complet d'un point-virgule, il devrait compiler:

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 . 

Le message d'erreur signifie, 'hey je suis Zeez/3 et vous avez jeté dans une clause 2-arité, wtf?

17

Vous essayez de définir deux fonctions, la première avec 3 paramètres (zeez/3) et l'autre avec 2 paramètres (zeez/2). L'erreur d'incompatibilité de la tête est due au fait que la fonction zeez/3 de la ligne précédente doit être terminée avec un '.'.

I.e. parce que vous avez fini la fonction Zeez/3 précédente avec un « ; », il attend la déclaration ci-après pour un autre match pour 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)]); 

Vous devez également noter que le compilateur vous donnera des avertissements au sujet "... la clause précédente à la ligne xxx correspond toujours" en raison de l'ordre de zees (espace, 0) et zeez (espace, M). Vous devriez mettre zees (espace, 0) avant zeez (espace, M), car il est plus spécifique.