2010-05-04 4 views
6

지난 8 시간 동안 Erlang을 사용 해왔고, 내 콘솔이 돌아 오는 예외 오류를 파악하려고 키보드에서 머리를 두 드렸습니다.Erlang의 예외 오류

나는 erlang을 배우기 위해 주사위 프로그램을 쓰고 있습니다. 나는 콘솔에서 erlang 인터프리터를 통해 호출 할 수 있기를 원합니다. 이 프로그램은 여러 개의 주사위를 받아들이고 값 목록을 생성합니다. 각 값은 1에서 6 사이 여야합니다.

문제 (무작위 엔지니어링)를 시도하고 수정하기 위해 수십 개의 개별적인 미세 변경 사항을주지는 않겠지 만 코드와 오류를 게시 할 것입니다.

근원 : 예상처럼

-module(dice2). 
-export([d6/1]). 

d6(1) -> 
    random:uniform(6); 
d6(Numdice) -> 
    Result = [], 
    d6(Numdice, [Result]). 

d6(0, [Finalresult]) -> 
    {ok, [Finalresult]}; 

d6(Numdice, [Result]) -> 
    d6(Numdice - 1, [random:uniform(6) | Result]). 

내가 지금처럼 내 콘솔에서 프로그램을 실행 ... dice2:d6(1).

... 나는 한 여섯 사이의 임의의 번호를 . 나는 다음과 같은 예외가 인수로보다 높은 숫자 ...

**exception error: no function clause matching dice2:d6(1, [4|3])

와 동일한 기능을 실행할 때 그러나 ... 나는 일치하는 주장하지만 돈과 기능이없는 II를 알고 가변 인수를 가진 함수를 쓰는 방법을 알았고 변수 숫자을 인수로 사용합니다.

나는 .... 그래서 같은 질문에

d6(Numdice, [Result]) -> 
    Newresult = [random:uniform(6) | Result], 
    d6(Numdice - 1, Newresult). 

을 기능을 수정 시도 ...하지만 난 기본적으로 동일한 오류가 발생했습니다. 아무도 여기서 무슨 일이 일어나는 지 알아?

답변

6

기본적으로 이것은 유형 오류입니다. Result이 목록 인 경우 [Result]은 하나의 요소가있는 목록입니다. 예를 들어 함수가 작동하면 항상 하나의 요소 인 Finalresult이있는 목록을 반환합니다. 첫 번째 호출에서 [[]]을하지 않으려는, 아마도

d6(2) ==> %% Result == [] 
d6(2, [[]]) ==> %% Result == [], let's say random:uniform(6) gives us 3 
d6(1, [3]) ==> %% Result == 3, let's say random:uniform(6) gives us 4 
d6(0, [4|3]) ==> %% fails, since [Result] can only match one-element lists 

, 당신은 3 일에 Result을 원하지 않는 :

이 ("에 감소"에 대한 ==> 사용) 일 것입니다 세 번째 전화. 이 문제를 해결해야합니다 :

d6(Numdice) -> Result = [], d6(Numdice, Result). %% or just d6(Numdice, []). 

d6(0, Finalresult) -> {ok, Finalresult}; 
d6(Numdice, Result) -> d6(Numdice - 1, [random:uniform(6) | Result]). 

레슨 : 언어가 동적으로 입력되면 이것이 올바른 형식을 피할 수있는 것은 아닙니다. 반대로 컴파일러는 가능한 한이 작업을 수행하는 데 도움이되지 않습니다.

+1

당신의 솔루션은 아름답게 작동했고 제 실수를 이해하는 데 도움이되었습니다. 나는 기능적 패러다임에 익숙하지 않아 흡수 할 것이 많다. 빈 목록으로 d6 (Numdice, Result)을 호출하여 혼란 스러웠던 곳에서 리 바인드 할 수 없기 때문에 새 호출은 빈 목록에 대해 d6에 대한 매개 변수 중 하나와 만 일치 할 수있게되었습니다 범위에있는 변수. 바인딩 규칙이 주어진 함수 내에서만 * 다음 호출 [롤스 아이] 전에 적용된다는 사실을 잊어 버렸을 것입니다. 일치하는 문제에 빠졌고 요소 길이를 잊어 버렸습니다. 어쨌든 내 질문에 답변 해 주셔서 감사합니다. – Jim

+0

대답을 투표 할 수는 있지만 대답을 수락 할 수 있다는 것을 잊지 마시기 바랍니다 :) –

+1

단지 완성을 위해 :'d6 (1)'은 숫자를 제공합니다. 'd6 (2)'는 다른 버그를 유발할 수있는'{ok, [Value1, Value2]}'를 제공합니다. – ZeissS