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

时间:2015-01-26 04:00:14

标签: pattern-matching ocaml

我最近在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 ->将匹配所有内容,因此| _ ->是多余的,所以我记得我使用的模式匹配不正确。

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

1 个答案:

答案 0 :(得分:2)

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

constr pattern

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