Ocaml 模式匹配编译时错误消息

Ocaml pattern match compile-time error message

最近在OCaml模式匹配上犯了一个错误,基本思路如下:

utop # module X = struct let x = 10 end;;
module X : sig val x : int end     

utop # match 10 with 
| X.x -> x
| _ -> 0;;
Error: Parse error: [module_longident] expected after "." (in [module_longident])

现在,回想起来我知道我犯的错误:如果模式匹配,模式中使用的变量名称将被绑定。它们不会被用作常量来匹配,即使它们是。

但是,错误消息让我彻底崩溃了。如果我不使用 x 作为模块的一部分,我会得到一个更容易理解的消息:

utop # let x = 20;;
val x : int = 20

utop # match 10 with 
| x -> x
| _ -> 0;;
Characters 26-27:
Warning 11: this match case is unused.
- : int = 10

在第二个示例中,我理解了错误消息:| x -> 将匹配所有内容,因此 | _ -> 是多余的,所以我记得我使用的模式匹配不正确。

我的问题是:有人可以向我解释第一个示例的错误消息吗?

如果您查看 OCaml 手册 Section 6.6 中模式的定义,模块名称唯一可以出现的地方(据我所知)是在这条规则中:

constr pattern

换句话说,如果您给出模块名称,则语法需要来自其他模块的构造函数。您可以在模块中有一个子模块,但最终您需要一个构造函数名称。构造函数名称以大写字母开头,但您的标识符以小写字母开头。这(但不令人满意)是错误消息试图告诉你的(我认为)。