Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List OCaml:删除列表的第一个元素_List_Ocaml_Head - Fatal编程技术网

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