[1;2]说,我有一个有两个项目的列表。我试着用这个代码提取第二项。
let _::b::_ = [1;2] in b编译器给出警告Warning 8: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: (_::[]|[])
虽然这是明智的,但我更想知道我们如何才能做得更好。可能没有预兆吗?
发布于 2020-10-26 01:48:53
这是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 = 2https://stackoverflow.com/questions/64530243
复制相似问题