我最近在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 ->
将匹配所有内容,因此| _ ->
是多余的,所以我记得我使用的模式匹配不正确。
我的问题是:有人可以向我解释第一个例子的错误信息吗?
答案 0 :(得分:2)
如果你看一下OCaml手册Section 6.6中模式的定义,那么模块名称可以出现的唯一地方(据我所知)就在这条规则中:
constr pattern
换句话说,如果您提供模块名称,则语法需要来自其他模块的构造函数。你可以在模块中有一个子模块,但最终你需要一个构造函数名称。构造函数名称以大写字母开头,但您的标识符以小写字母开头。这(但不满意)是错误消息试图告诉你的(我认为)。