2017-09-24 40 views
0

我試圖使這個遞歸函數它接受一個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