OCaml:删除列表的第一个元素

时间:2014-10-15 10:24:17

标签: list ocaml head

我有一对由几对数字组成的列表:

[(1,2);(3,4);(5,6);(7,8)]

我想从列表中删除第一个元素(头部),因此输出应为:

[(3,4);(5,6);(7,8)]
有人可以帮帮我吗?我正在考虑这个功能,但它不起作用:

let cut x  = function
[] -> []
| (a,b) -> []
| (a,b)::ris -> ris

3 个答案:

答案 0 :(得分:1)

你可以写简单:

let cut = List.tl

你没有错。 第三行应该看起来像

| [(a,b)] -> []

| (a,b) :: [] -> []

P.S。顺便说一句,这第三行是不必要的。只需删除它。 并在第一行删除x

let cut = function

答案 1 :(得分:1)

你快到了:

let tl x = match x with
  | [] -> []  (* or   failwith "empty"  *)
  | ab::ris -> ris

几点:

  • function接受另一个论点。您的函数已经获得了一个arg,因此请改用match x with
  • 您只对列表为空或者有“尾部”感兴趣,因此您无需将其元素与元素进行模式匹配。
  • 此功能在OCaml中称为“tail”,称为List.tl

答案 2 :(得分:0)

请记住,

let f x y = function -> <code>

实际上是一种捷径(或语法糖),用于:

let f x y z = match z with -> <code>

因此,它只是剪切函数中的最后一个参数,并自动匹配它。

另外,在模式匹配时请记住,模式匹配左侧的所有表达式都应该具有相同的类型。否则,编译器可能会选择一个随机的,并确定所有其他类型具有相同的类型,从而产生一些有些混乱的错误消息。模式匹配的右侧也是如此。所以,当你看到一个编译器消息,说某些东西不是他所期望的那样时,只需检查这个前提条件:

| []                 (* is a list, by definition *)
| (a,b) -> []        (* is a pair, by definition of a pair *)
| (a,b)::ris -> ris  (* is a list, by definition of (::) *)

如果左侧部分有效,请查看右侧。

另外,如果你有一个你不需要使用的变量,那么最好给它一个以下划线开头的名字,或者只是一个下划线。

let cut = function
  | [] -> [] 
  | _::xs -> xs