2017-10-31 1 views
1

내가 이전 행 (TMP)의 목록을 사용하여, 파스칼 삼각형을 생성하기 위해 노력하고과 같이이 경우에 목록과 일치의 크기를 평가하려는 해요 :평가와 일치하지 않는 이유는 무엇입니까?

(* b is the index pos I'm generating at the moment *) 
(* I need a function I can pass into another function, so the case must evaluate at runtime *) 

fun b -> match b with 
| 0 -> 1 
| List.length tmp -> 1 
| _ -> (* Ignore this part *) 

을하지 않는 이유 두 번째 라인은 평가하고 일치합니까?

답변

2

OCaml 일치는 패턴이 컴파일 타임에 알려져 있기 때문에 매우 효율적입니다. 런타임에 계산 된 값과 비교하려면 if을 사용할 수 있습니다.

match에는 초기 일치를 수행 한 후 표현식 값을 테스트하는 데 사용할 수있는 when 절이 있습니다. 이는 if과 동일하지만 때로는 더 깨끗합니다.

1

List.length tmp은 패턴이 아닙니다. 이것은 표현식입니다. match은 패턴으로 만 작동합니다. 참조 patterns

+0

어떻게 표현식을 패턴으로 변환 할 수 있습니까? – Swift142

0

여기에는 패턴이 없으며, 조건식이있는 값만 사용할 수 있으므로 평가할 수있는 값이 있습니다.

if b = 0 then 1 else 
    if b = (List.length tmp) then 1 else 
    whatever expression 
관련 문제