문제

나는 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".
도움이 되었습니까?

해결책

문제는 두 가지 기능을 혼합했다는 것입니다.

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에 던져 졌습니까?'

다른 팁

첫 번째 매개 변수 (Zeez/3), 다른 하나는 2 개의 매개 변수 (Zeez/2) 인 두 가지 함수를 정의하려고합니다. 헤드 불일치 오류는 이전 줄의 Zeez/3 함수가 a '.'로 종료되어야하기 때문입니다.

즉, ';'로 이전 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, 0)를 Zeez (Space, M) 전에 넣어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top