Cosa significa & # 8220; head mismatch & # 8221; errore del compilatore significa?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Provo a scrivere il codice per stampare il carattere Z.

zzzzzzz
     z
    z
   z
  z
 z
zzzzzzz

Ma quando compilo questo codice, genera

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

Non posso correggere questo errore. Non ho trovato cosa non potevo.
Uno, per favore, mi suggerisce.
Grazie.

-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".
È stato utile?

Soluzione

il problema è che hai confuso 2 funzioni:

zeez / 2 e zeez / 3

Se si termina la funzione zeez / 3 terminandola con un punto e non un punto e virgola, dovrebbe essere compilata:

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 .

Il messaggio di errore significa "hey sono in zeez / 3 e hai gettato una clausola 2-arity, wtf?"

Altri suggerimenti

Stai cercando di definire due funzioni, la prima con 3 parametri (zeez / 3) e l'altra con 2 parametri (zeez / 2). L'errore di mancata corrispondenza head è dovuto al fatto che la funzione zeez / 3 sulla riga precedente deve essere terminata con un '.'.

vale a dire. poiché hai terminato la precedente funzione zeez / 3 con un ';', si aspetta che la seguente dichiarazione sia un'altra corrispondenza per 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)] );

Dovresti anche notare che il compilatore ti darà avvertimenti su " ... la clausola precedente alla riga xxx corrisponde sempre a " a causa dell'ordinamento di zees (spazio, 0) e zeez (spazio, M). Dovresti mettere zees (spazio, 0) prima di zeez (spazio, M), perché è più specifico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top