【问题标题】:OCaml: remove the first element of a listOCaml:删除列表的第一个元素
【发布时间】:2014-10-15 10:24:17
【问题描述】:

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

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

我想从列表中删除第一个元素(头部),所以输出应该是:

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

有人可以帮助我吗?我正在考虑这个功能,但它不起作用:

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

【问题讨论】:

    标签: list ocaml head


    【解决方案1】:

    记住,那个

    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
    

    【讨论】:

    • 感谢分享。我不知道这一点。
    【解决方案2】:

    你快到了:

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

    几点:

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

    【讨论】:

      【解决方案3】:

      你可以写得简单:

      let cut = List.tl
      

      你有点小错误。 第三行应该是这样的

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

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

      附:顺便说一句,这第三行是不必要的。只需将其删除。 并在第一行删除x

      let cut = function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 2017-08-18
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多