如何访问ocaml中列表中的最后一个元素

时间:2015-03-24 23:18:55

标签: list pattern-matching ocaml

我知道使用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
;;

4 个答案:

答案 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的最后一个元素。