【发布时间】: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
【问题讨论】:
我有一个由几对数字组成的列表:
[(1,2);(3,4);(5,6);(7,8)]
我想从列表中删除第一个元素(头部),所以输出应该是:
[(3,4);(5,6);(7,8)]
有人可以帮助我吗?我正在考虑这个功能,但它不起作用:
let cut x = function
[] -> []
| (a,b) -> []
| (a,b)::ris -> ris
【问题讨论】:
记住,那个
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
【讨论】:
你快到了:
let tl x = match x with
| [] -> [] (* or failwith "empty" *)
| ab::ris -> ris
几点:
function 接受另一个论点。您的函数已经获得了一个 arg,因此请改用 match x with。List.tl。【讨论】:
你可以写得简单:
let cut = List.tl
你有点小错误。 第三行应该是这样的
| [(a,b)] -> []
或
| (a,b) :: [] -> []
附:顺便说一句,这第三行是不必要的。只需将其删除。
并在第一行删除x:
let cut = function
【讨论】: