2013-07-22 2 views
2

필자는 코드 정의에 타입 정의를 추가하기로 결정했고, Typer를 사용하여 시작점 (erlang 15b02, typer 0.9.4)을 얻었습니다. 예기치 않은 결과 (타이프 사용)

나는 모든 일이 잘 있는지 확인하기 위해 몇 가지 결과를 포착하고 이해가 안이 결과 발견

-spec par(boolean(),'f' | 'o') -> [40 | 41]. 

내가 입력을 이해할 수 : 사양을 생산

par(true, o) -> "("; 
par(true, f) -> ")"; 
par(_, _) -> "". 

을 매개 변수는 내 보내지 않았고 내 코드는 부울 식을 첫 번째 매개 변수로, 원자 o 또는 f를 두 번째로만 호출합니다 (예 : par(4 > P, o)).

그러나 왜 반환 목록에 빈 목록이 포함되어 있지 않습니까? 나는 또는 [40 | 41 | ""]

과 같은 것을 기대하고있었습니다.이 코드는 수학 표현식 인쇄에 사용되며 우선 순위 또는 연산자가 충분할 때 괄호를 사용하지 않습니다. 예를 들어

3 + 4 + 5 * (6 + 7) - sin(x + 7)보다는

3 + (4 + ((5 * (6 + 7)) - sin((x + 7))))

인쇄 할 수 있습니다.

시험 범위의 결과 같이 내가 코드를 첫 번째 매개 변수로 허위로 호출 확신 : 유형 X의 0 개 이상의 요소의 목록은 "Erlang type specification, [X] 수단으로서

15..| par(true, o) -> "("; 
    15..| par(true, f) -> ")"; 
    308..| par(_, _) -> "". 

답변

5

". 귀하의 사례에서 X40 | 41이므로 "(", ")", "()()"""은 모두이 유형과 일치합니다. 정확히 하나의 요소 목록을 형식 스펙으로 표현할 수있는 방법은 없습니다.

하나 이상의 요소가 포함 된 목록은 [X,...]으로 지정 될 수 있습니다. typer가 [40 | 41,...] 대신에 [40 | 41]이라고 말하면 함수가 빈 목록을 반환 할 수 있음을 알 수 있습니다.

+0

감사합니다. 나는 다른 결과에서 사용되었지만 ...의 의미를 기억하지 못했습니다. – Pascal