我有一对由几对数字组成的列表:
[(1,2);(3,4);(5,6);(7,8)]
我想从列表中删除第一个元素(头部),因此输出应为:
[(3,4);(5,6);(7,8)]
有人可以帮帮我吗?我正在考虑这个功能,但它不起作用:
let cut x = function
[] -> []
| (a,b) -> []
| (a,b)::ris -> ris
答案 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
。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