ocaml - 警告 8 : Incomplete pattern matching warning in a let statement

标签 ocaml

我经常在 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/

相关文章:

Ocaml 变体类型

c - 如何将 OCaml 库移植到可从 C 代码访问的库中?

ocaml - Ocaml 如何决定用户定义运算符的优先级?

types - OCaml - 创建自定义类型的自定义类型

arrays - OCaml 中的数组操作

recursion - 尾递归在OCaml中的应用

list - List.rev 行为奇怪吗?

ocaml - 带有子目录的 Oasis 构建配置

performance - F# 处理复杂键(如数据结构中的 int*int*int)比 Ocaml 慢得多

ocaml - 如何在 OCAML 中使用 List.Map 跳过一个术语?