0

我正在尝试制作这个递归函数,它需要一个int x和一个列表,然后从列表中删除第一批x元素:

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似乎永远不会匹配,它总是返回[]

4

1 回答 1

1

我想提供对代码的改进作为答案(因为 OP 已经找到了解决方案)。

模式匹配 integer 感觉是多余的int_t。您当然可以这样做,但是当与记录或变体等代数数据类型或列表等集合一起使用时,模式匹配的好处变得显而易见。此外,使用if..else整数可以使代码更清晰,并将基本情况与归纳情况区分开来。

let rec drop n li =
  if n = 0 then li else
  match li with
  | [] -> [] 
  | h::t -> drop (n-1) t
于 2017-09-24T04:21:50.683 回答