2017-09-24 1 views
0

I는 int x과리스트를 얻어이 재귀 함수를 만들려고하고리스트에서 요소의 제 x 양 제거있어 일치 :의 Caml/OCaml의 패턴 : 다중 인수 함수

let rec nthcdr int_t list_t = 
    match int_t with 
    | 0 -> list_t 
    | _ -> (match list_t with 
      | [] -> [] 
      | h::tail -> nthcdr (int_t -1) tail) 
    ;; 

을하지만을 작동하지 않는다. h::tail은 절대 일치하지 않는 것처럼 보입니다. 항상 반환됩니다. []

+1

재생산 할 수 없습니다. 어떻게 테스트하고 있습니까? – melpomene

+0

@melpomene에 동의합니다. 당신은 코드가 나를 위해 일하므로 어쩌면 결함이있는 테스트 일 수 있습니다. 내 테스트는 다음과 같습니다 :'nthcdr 3 [1; 2; 3; 4; 5]'==>'int list = [4; 5]'. –

+1

내 나쁜 녀석들! 나는 잘못 테스트했다. – Jose

답변

1

답변으로 코드를 개선하고 싶습니다. (OP가 이미 해결책을 찾았 기 때문에).

int_t과 일치하는 패턴이 중복됩니다. 물론 그렇게 할 수는 있지만 패턴 일치의 이점은 레코드 나 변형 또는 목록 같은 컬렉션과 같은 대수 데이터 유형과 함께 사용될 때 분명 해집니다. 또한 정수에 if..else을 사용하면 코드 정리가 쉬우므로 유도 사례와 기본 사례를 구분할 수 있습니다.

let rec drop n li = 
    if n = 0 then li else 
    match li with 
    | [] -> [] 
    | h::t -> drop (n-1) t