【问题标题】:Ocaml pattern match compile-time error messageOcaml 模式匹配编译时错误消息
【发布时间】:2015-01-26 04:00:14
【问题描述】:

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

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

【问题讨论】:

    标签: pattern-matching ocaml


    【解决方案1】:

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

    constr pattern
    

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

    【讨论】: