List OCaml:删除列表的第一个元素
我有一个由几对数字组成的列表:List OCaml:删除列表的第一个元素,list,ocaml,head,List,Ocaml,Head,我有一个由几对数字组成的列表: [(1,2);(3,4);(5,6);(7,8)] 我想从列表中删除第一个元素(head),因此输出应该是: [(3,4);(5,6);(7,8)] 有人能帮我吗?我在考虑这个函数,但它不起作用: let cut x = function [] -> [] | (a,b) -> [] | (a,b)::ris -> ris 你可以写得很简单: let cut = List.tl 你没有什么错误。 第三行应该是这样的 | [(a,b)]
[(1,2);(3,4);(5,6);(7,8)]
我想从列表中删除第一个元素(head),因此输出应该是:
[(3,4);(5,6);(7,8)]
有人能帮我吗?我在考虑这个函数,但它不起作用:
let cut x = function
[] -> []
| (a,b) -> []
| (a,b)::ris -> ris
你可以写得很简单:
let cut = List.tl
你没有什么错误。
第三行应该是这样的
| [(a,b)] -> []
或
顺便说一下,第三行是不必要的。把它拿走。
并删除第一行中的x
:
let cut = function
你就快到了:
let tl x = match x with
| [] -> [] (* or failwith "empty" *)
| ab::ris -> ris
几点:
接受另一个参数。您的函数已获得一个参数,因此请改用函数
匹配将x与
- 您只对列表为空或有“尾”感兴趣,因此不需要将其元素作为元组进行模式匹配
- 此函数在OCaml中称为“tail”,称为
List.tl
- 记住
let f x y = function -> <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
谢谢分享。我没有意识到这一点。
| [] (* 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