使用 OCaml 警告属性禁用警告 8:不完全匹配

Use OCaml warning attribute to disable warning 8: unexhaustive match

我正在尝试编写类似于以下的代码:

let [a; b] =
  (* body *) 
  [1; 2]

而且我只想针对模式 [a; b] 而不是正文或 let 之外的任何内容禁用警告 #8。我试图将警告属性设置为禁用警告,但是 none 以下工作:

let[@warning "-8"] [a[@warning "-8"];b[@warning "-8"]] [@warning "-8"] =
  [1;2][@warning "-8"]
[@@ocaml.warning "-8"]

P.S。我并不是真的在写这段代码,而是在试验一个自定义的 PPX 预处理器。所以一个复杂但有效的例子是可以接受的。

4.06.0 之前的 OCaml 版本不支持使用 [@warning "…"][@@warning "…"] 本地禁用警告。对于这样的版本,一种可能是使用封闭 [@@@warning ""] 属性:

[@@@warning "-8"]
let [a;b] = [1;2]
[@@@warning "+8"]

但这也会停用体内的警告。

如果您正在生成代码并且统计地知道列表的大小,另一种选择可能是使用元组进行绑定(又名 let (a,b)= …)?