如何改进匹配模式以提取Ocaml中列表的第二项

问题描述

我有一个包含两个项目的列表,例如para1.para2. 。我尝试通过此代码提取第二项。

[1;2]

编译器发出警告let _::b::_ = [1;2] in b

尽管这很明智,但我想知道我们如何做得更好。可能没有警告吗?

解决方法

这是OCaml详尽检查模式的缺点。在几乎所有情况下,它都是非常有用的,但是在某些情况下,您想使用一种不详尽的模式。也就是说,在您知道可能的值在某种程度上受到限制的情况下。

如果您绝对肯定您的列表中至少包含2个元素,则可以使用List.nth

# List.nth [1; 2] 1;;
- : int = 2

但是,这仅适用于从列表中提取一个值,而不是一般情况。

您可以关闭穷举性警告:

# let [@warning "-8"] _ :: b :: _ = [1; 2] in b;;
- : int = 2

您可以编写一个详尽的模式,这是我通常自己做的事情:

# match [1; 2] with
  | _ :: b :: _ -> b
  | _ -> assert false ;;
- : int = 2