2017-09-24 41 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