使用 OCaml 警告属性禁用警告 8:不详尽的匹配

Vla*_*hev 4 attributes warnings ocaml

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

let [a; b] =
  (* body *) 
  [1; 2]
Run Code Online (Sandbox Code Playgroud)

我想仅针对模式禁用警告 #8 [a; b],而不是针对正文或 let 之外的任何内容。我尝试设置警告属性来禁用警告,但以下方法都不起作用:

let[@warning "-8"] [a[@warning "-8"];b[@warning "-8"]] [@warning "-8"] =
  [1;2][@warning "-8"]
[@@ocaml.warning "-8"]
Run Code Online (Sandbox Code Playgroud)

PS 我并不是真的在编写这段代码,而是正在尝试使用自定义 PPX 预处理器。因此,一个复杂但有效的示例是可以接受的。

oct*_*ron 5

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

\n\n
[@@@warning "-8"]\nlet [a;b] = [1;2]\n[@@@warning "+8"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这也会使体内的警告失效。

\n\n

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

\n

  • 对于 4.06,`let@[warning "-8"] [a;b] = (body)[@warning "+8"]` 将停用 `[a;b]` 绑定上的警告 8 并在身体。关于元组,另一个奇特的选项可能是类型级别大小的列表(类似于 `type ('elt, 'size) t = []: ('elt,zero) t | (::): 'elt * ('elt, '大小)t ->('elt,'大小succ)t`) (3认同)
  • 之前评论中的拼写错误:`let@[warning "-8"]` -> `let[@warning "-8"]`。 (2认同)