问题描述
我有一个包含两个项目的列表,例如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