2015-03-24 65 views
4

我知道当使用ocaml模式匹配时,可以使用h::t 当使用此参数时,h引用列表中的第一个元素,t将引用列表的其余部分。是否有可能使用相同类型的匹配来获取列表中的最后一个元素。所以t将引用最后一个元素,h将引用列表的其余部分。如何访问ocaml中的列表中的最后一个元素

的代码的例子,对于是

let rec remove x y = match y with 
    [] -> x 
| h::t -> remove (remove_element x (get_last y)) h 
;; 

回答

3

不,这将是有益的,没有模式,对一个列表的末尾匹配。这在OCaml中不是一个有吸引力的结构,因为它需要线性时间才能找到列表的末尾。 OCaml模式匹配应该很快。

您可以反转您的列表并匹配反转列表的开头。这只是一个常数因子,比找到列表的末尾要慢。

+0

完美的工作我甚至已经创建了一个反向函数。谢谢 – 2015-03-24 23:36:20

+3

标准库中已经存在一个反向函数:'List.rev' – 2015-03-26 00:58:07

4

如果你想获得最后一个元素,那么你可以直到你遇到这种情况递归遍历列表:| [x] -> x

-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> 

警告是行返回“最后一个元素...”,使明显,[x]x :: []是相同的。

所以当递归遍历列表时,您可以识别最后一个元素。但是你不能在一种模式中拥有第一个和最后一个元素。

一种替代方法是将列表转换为数组Array.of_list,您可以在索引(Array.length yourarray) - 1处找到最后一个元素。

相关问题