我知道使用ocaml模式匹配时可以使用h::t
当使用它时,h引用列表中的第一个元素,t将引用列表的其余部分。是否可以使用相同类型的匹配来获取列表中的最后一个元素。所以t将引用最后一个元素,h将引用列表的其余部分。
这个有用的代码示例是
let rec remove x y = match y with
[] -> x
| h::t -> remove (remove_element x (get_last y)) h
;;
答案 0 :(得分:5)
不,没有与列表末尾匹配的模式。它在OCaml中不是一个有吸引力的结构,因为它需要线性时间来查找列表的结尾。 OCaml模式匹配应该很快。
您可以撤消列表并匹配反向列表的开头。它只是一个比查找列表末尾慢的常数因素。
答案 1 :(得分:4)
如果您想获取最后一个元素,那么您可以递归遍历列表,直到遇到这种情况:| [x] -> x
答案 2 :(得分:1)
正如其他答案所说,你必须遍历/反转列表才能访问它。
根据具体问题,您可以考虑使用其他数据结构。
OCaml的标准库提供Queue
,您可能会对此感兴趣:
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Queue.html
答案 3 :(得分:-1)
我可以找到2个匹配列表最后一个元素的模式,一个已经由aycc提到过。这是为了快速测试:
# let matchtest = function
| [] -> "empty list"
| [x] -> "single element list with " ^ x
| x :: [] -> "last element: " ^ x
| x :: tail -> "at least 2 elements"
;;
Warning 11: this match case is unused.
val matchtest : string list -> string = <fun>
警告是针对返回的行&#34;最后一个元素...&#34;,表明[x]
和x :: []
是相同的。
因此,当递归遍历列表时,您可以识别最后一个元素。但是你不能在一种模式中拥有第一个和最后一个元素。
另一种方法是将列表转换为Array.of_list
数组,在那里找到索引为(Array.length yourarray) - 1
的最后一个元素。