我经常在 let 语句中进行模式匹配,我知道结果的形状。很明显,我不能指望编译器通常会推断出这些知识,但也许有一种更惯用的方式以简洁的方式来做到这一点。
作为一个例子,请看下面的代码:
type foo = A of int | B of string
let x = (true, A 0)
let (b, A i) = x in i + 2
这正确地警告了我,这是
(_, B _)
的结果不匹配。一种可能的方法是显式处理丢失的情况,如下所示:let (b,i) = match x with
| (a, A j) -> (a,j+2)
| _ -> failwith "implementation error!"
但这掩盖了实际计算。有没有更简洁的替代方案?
编辑: Jeffrey Scofield 指出,在没有嵌套的情况下,显式转换函数效果很好。是否还有嵌套类型匹配的版本?
最佳答案
如果你确定你得到了正确的案例并且你使用的是 OCaml 4.02 或更高版本,你可以添加 [@@warning "-8"]
到您的声明。
见 the OCaml manual有关属性的更多详细信息。
在以前版本的 OCaml 上,您可以禁用关于整个文件的警告(这取决于您的构建工作流程)或使用显式模式匹配,如 Jeffrey Scofield 的回答中所述。
不过,我建议不要“禁用整个文件的警告”,因为它会掩盖其他不完整的模式匹配,这些匹配可能会在当前(很容易发现)以意想不到的方式破坏您的代码......或在 future 的某个地方(例如,如果您更改了在以后升级中匹配的类型)。
关于ocaml - 警告 8 : Incomplete pattern matching warning in a let statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29801357/